Как удалить элементы из HashMap через ввод с клавиатуры? - PullRequest
0 голосов
/ 28 января 2020

Моя проблема - метод deleteEntry (второй последний метод). Я хочу иметь возможность вводить целое число через сканер, позиция которого должна быть удалена из HashMap. Так что, если у меня есть 5 объектов в HashMap и введите 3 в методе удаления, он должен удалить третью запись. Как я могу это сделать?

import java.util.*;
public class ShoppingList
{
   private HashMap<String, Integer> list;
   private Scanner sc;
   private int input;
   private String article;
   private int number;
   private int index;
   private int value;

    public ShoppingList()
    {
       list = new HashMap<>();
       sc = new Scanner(System.in);
       article = null;
       number = 1;
    }


    public void menue(){
        do{
            System.out.println("___________________________________________________");
            System.out.println("1. Add Entry");
            System.out.println("2. Show List");
            System.out.println("3. Delete Entry");
            System.out.println("4. Delete List");            
            System.out.println("0. Exit");
            System.out.println("___________________________________________________");

            input = sc.nextInt();

            switch (input){
                case 1:
                addEntry(); break;   
                case 2:
                showList(); break;        
                case 3:
                deleteEntry(); break;                 
                case 4:
                deleteList(); break;                                
                default:
                System.out.println("Exit"); break;   
            }
        }
            while (input != 0);
    }

    public void addEntry(){

           System.out.println("Add Entry: "); 
           article = sc.next();

            System.out.println("Number: ");
            number = sc.nextInt();
            list.put(article, number);      
      }

    public void showList(){
      Iterator <String> it = list.keySet().iterator();
      for (String key : list.keySet()){
       System.out.println(key + ": " + list.get(key));
      }
    }

    public void deleteEntry(){
     System.out.println("Number of item you want to remove:");

     index = sc.nextInt();
     index = index--;
     value = list.get(index);
     list.remove(value);
    }    

    public void deleteList(){
      list.clear();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Каждый товар в вашем списке покупок - это не только название товара, но и количество этого товара. Когда-нибудь (гипотетически) вы можете добавить другие свойства к каждому элементу списка, например, максимально допустимую цену или цену продажи, при которой вы будете покупать этот продукт.

Итак, создайте специальный тип для представления списка. Предметы. Вы пытаетесь использовать запись карты для этой цели, но на объектно-ориентированном языке у вас есть гораздо более мощные опции.

Храните свои предметы в списке, так как порядок важен.

class ShoppingItem {
  private final String name;
  private final int quantity;
  ShoppingItem(String name, int quantity) {
    this.name = Objects.requireNonNull(name);
    if (quantity < 1) throw new IllegalArgumentException();
    this.quantity = quantity;
  }
  String getName() { return name; }
  int getQuantity() { return quantity; }
}

Измените текущий класс для работы с List<ShoppingItem>:

public class ShoppingList {

  private List<ShoppingItem> list = new LinkedList<>();

  public void addEntry(){
    System.out.println("Add Entry: "); 
    String article = sc.next();
    System.out.println("Number: ");
    int number = sc.nextInt();
    list.add(new ShoppingItem(article, number);
  }

  public void deleteEntry(){
    System.out.println("Number of item you want to remove:");
    int number = sc.nextInt();
    list.remove(number - 1);
  }

  public void showList(){
    for (ShoppingItem item : list) {
      System.out.printf("%s: %d%n", item.getName(), item.getQuantity());
    }
  }

  ... /* Etc. */

Обратите внимание также что большинство ваших переменных класса будут лучше, чем локальные переменные, поскольку присвоенные им значения имеют смысл только в рамках метода.

0 голосов
/ 28 января 2020

Map не заказано

У реализации Map нет заказа. Вы просите получить запись карты по порядковому номеру, например третьему или пятому. Это не имеет смысла в контексте карты. в Map нет такой вещи, как «третья запись» . Вы можете сделать это с List, но не с Map.

. Некоторые карты имеют концепцию порядка итераций ключей. Большинство реализаций, связанных с Java 11, не поддерживают это, но некоторые поддерживают.

  • Несколько имплантаций реализуют интерфейс NavigableMap и его предшественник, SortedMap интерфейс. Итерации выполняются по естественному порядку клавиш или по Compatator, который вы передаете.
    • TreeMap
    • ConcurrentSkipListMap
  • LinkedHashMap повторяет записи в том порядке, в котором они были первоначально вставлены.
  • EnumMap выполняет итерации записей в том порядке, в котором ключ был определен в его классе, в его Enum подклассе.

Но ни один из них не поддерживает доступ по порядковому номеру или индексу. Вы можете получить первую или последнюю запись. Для других позиций между первым / самым низким и последним / самым высоким вы должны выполнить итерацию.

Вот таблица с характеристиками 10 реализаций Map в комплекте с Java 11. Обратите внимание на столбец итерационный порядок .

Обходной путь: Map::keySet> List> Collections.sort> List::get> Map::get

Для достижения sh вашей цели, возможно, вы могли бы позвонить keySet, чтобы получить Set ключевых объектов. Затем составьте список тех, кто вам нравится. Представьте этот список в вашем пользовательском интерфейсе. Когда пользователь запрашивает пятый элемент, извлеките его из списка по индексу (5-1), чтобы иметь ключ под рукой. Затем go к вашей карте и вызовите get для значения, сохраненного для этого конкретного ключа.

Что-то вроде этого примера кода.

Map < Person, String > personToProjectMap = new HashMap <>( 5 );
personToProjectMap.put( new Person( "Carol" , "Connelly" ) , "Inventory Report" );
personToProjectMap.put( new Person( "Alice" , "Anderson" ) , "Sales Report" );
personToProjectMap.put( new Person( "Bob" , "Barker" ) , "Staff Report" );
personToProjectMap.put( new Person( "Edith" , "Enders" ) , "Marketing Report" );
personToProjectMap.put( new Person( "David" , "Dount" ) , "Investment Report" );

System.out.println( "DEBUG map size: " + personToProjectMap.size() );
System.out.println( "DEBUG personToProjectMap.toString() = " + personToProjectMap );

Set < Person > persons = personToProjectMap.keySet();
List < Person > personsList = new ArrayList <>( persons );  // Populate a `List` by feeding the items from our `Set`.
Collections.sort(       // Use the `Collections` utility class to sort our `List` by first name of each person used as a key in our map.
        personsList ,
        Comparator.comparing( ( Person person ) -> person.getGivenName() )
);

System.out.println( "DEBUG personsList.toString() = " + personsList );

// Present this list to the user in user-interface.
System.out.println( "Enter the number of the entry to remove." );
int nthPerson = 0;
for ( Person person : personsList )
{
    nthPerson++;
    System.out.println( "№ " + nthPerson + " " + person.getGivenName() + " ➙ " + personToProjectMap.get( person ) );
}
// …
int input = 3;   // … user enters 3
int index = ( input - 1 );
Person personPicked = personsList.get( index ); // Annoying zero-based counting for index.
personToProjectMap.remove( personPicked ); // Remove entry for the person picked by user.

System.out.println( "DEBUG map size: " + personToProjectMap.size() );
System.out.println( "DEBUG Result of deleting item from map:" );
System.out.println( personToProjectMap.toString() );

При запуске.

Размер карты отладки: 5

ОТЛАДКА personToProjectMap.toString () = {Person {данное имя = 'Боб' | surname = 'Barker'} = Отчет персонала, Person {данное имя = 'Edith' | surname = 'Enders'} = Маркетинговый отчет, Person {GivenName = 'Carol' | surname = 'Connelly'} = Отчет об инвентаризации, Person {данноеName = 'Алиса' | surname = 'Anderson'} = Отчет о продажах, Person {данноеName = 'David' | surname = 'Dount'} = Отчет об инвестициях}

DEBUG peopleList.toString () = [Person {данноеName = 'Алиса' | фамилия = 'Андерсон'}, Персона {данное имя = 'Боб' | фамилия = 'Баркер'}, Персона {данное имя = 'Кэрол' | фамилия = 'Коннелли'}, Персона {данное имя = 'Дэвид' | фамилия = 'Dount'}, Персона {данное имя = 'Эдит' | surname = 'Enders'}]

Введите номер удаляемой записи.

№ 1 Алиса Report Отчет о продажах

№ 2 Боб ➙ Отчет персонала

№ 3 Carol Report Инвентарный отчет

№ 4 David ➙ Инвестиционный отчет

№ 5 Edith ➙ Маркетинговый отчет

Размер карты отладки: 4

ОТЛАДКА Результат удаления элемента с карты:

{Person {GivenName = 'Bob' | surname = 'Barker'} = Отчет о персонале, Person {GivenName = 'Edith' | surname = 'Enders'} = Маркетинговый отчет, Person {данноеName = 'Алиса' | surname = 'Anderson'} = Отчет о продажах, Person {данноеName = 'David' | surname = 'Dount'} = Отчет об инвестициях}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...