2017-02-08 7 views
0

Я пытался работать этот код, и я думаю, что должно быть что-то я не могу видеть. Вот мой класс и его функция «добавить». Предполагается, что добавление обновит список и предоставит информацию счетчику. К сожалению, HashMap не отвечает, в то время как List делает. Есть идеи? Спасибо!Частота элементов в HashMaps

public class Basket { 

private List<Product> products; 
private HashMap<Product, Integer> counter; 

public Basket(){ 
    products = new LinkedList<Product>(); 
    counter = new HashMap<Product, Integer>(); 
} 

public void add(Product product){ 
    products.add(product); 
    for(Product key : counter.keySet()){ 
     if(product.getName() != key.getName()){ 
      counter.put(product, 1); 
     }else{ 
      counter.put(product, counter.get(product) +1); 
     } 
    } 
} 
+2

Не сравнивайте 'String' с '==', вместо этого используйте метод 'equals'. – Winter

ответ

-1

Вам не нужно делать это - if(product.getName() != key.getName()) в петлю и т.д.

Если все, что вы хотите, чтобы проверить, если Product уже существует/не в Map- , если нет, добавить продукт на карту, и установить счетчик на 1, если да увеличиваем счетчик на 1.

Вы можете сделать это:

if(counter.get(product) == null) 
    counter.put(product,1); 
else 
    counter.put(product, counter.get(product)+1); 

по умолчанию хэш-код() по мне класс Product гарантирует, что он знает, является ли это дублируемым объектом Product, который добавляется. Метод

ГЭТ() возвращает значение Key-Value конкретной пары.

+0

Возвращаемое значение будет равно нулю, а не нулю, если продукт отсутствует на карте, а второй тест является избыточным. – EJP

+0

Понял. Спасибо за предложения @EJP. Я закодирован для примитивного «int». –

+0

Когда будет 'counter.get (product) == 0' ever? –

-1

Ваш код не имеет никакого смысла. Вы проходите набор ключей, и если любой ключ не совпадает с вами вы добавляете продукт. Вам не нужно перемещаться по карте. Просто найдите его:

public void add(Product product){ 
    products.add(product); 
    Integer count = counter,get(product); 
    if (count == null) { 
     counter.put(product, 1); 
    }else{ 
     counter.put(product, count+1); 
    } 
} 

NB Синхронизация также необходима.

+0

@downvoter Пожалуйста, объясните. Что он? Его код имеет смысл? Он не пересекает набор ключей? Он не добавляет продукт, если какой-либо ключ не соответствует? Ему нужно пересечь карту? Не обманывай себя. – EJP

1

Есть два вопроса, которые я вижу с вашим кодом

1) Вы сравнением строк (два названия продуктов), используя! =, Которая не является правильным. Вы должны использовать String.equals() или String.equalsIngoreCase()

2) Вы также пытаетесь увеличить счетчик для продукта каждый раз, когда вы перебираете элемент на карте. Я уверен, что вы только хотите сделать это один раз.

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

public void add(Product product) { 
     products.add(product); 
     add: { 
      for (Product key : counter.keySet()) { 
       if (key.getName().equals(product.getName())) { 
        counter.put(key, counter.get(key) + 1); 
        break add; 
       } 
      } 
      counter.put(product, 1); 
     } 
    } 

в идеале, однако, вы должны переопределить .equals() и .hashCode() методы в продукте, а затем вы могли бы использовать метод HashMap.containsKey(), как это:

public void add(Product product) { 
     products.add(product); 
     if (counter.containsKey(product)) { 
      counter.put(product, counter.get(product) + 1); 
     } else { 
      counter.put(product, 1); 
     } 
    } 

и что также может быть дополнительно упрощена с помощью трехкомпонентной:

public void add(Product product) { 
     products.add(product); 
     counter.put(product, counter.containsKey(product) ? counter.get(product) + 1 : 1); 
    }