2015-10-20 4 views
1

Следующее мое требование: я должен подсчитать появление определенного элемента в списке, а затем распечатать элемент вместе с его количеством встречаемости. Для этого у меня есть следующий код:Как получить последнее значение дублирующего ключа на карте в java?

public void countOccurrences(Collection<String> list){ 
     Map<String, Integer> occurrenceMap = new HashMap<String, Integer>(); 

     for(String obj: list){ 
      Integer numOccurrence = occurrenceMap.get(obj); 
      if(numOccurrence == null){ 
       //first count 
       occurrenceMap.put(obj, 1); 
      } else{ 
       occurrenceMap.put(obj, numOccurrence++); 

      } 
     } 
     for (Map.Entry<String, Integer> entry : occurrenceMap.entrySet()) { 
      System.out.println(entry.getKey()+" : "+entry.getValue()); 
    } 
    } 

Теперь говорят, например, элементы, добавленные в список следующим образом:

list.add("apple"); 
list.add("apple"); 
list.add("apple"); 
list.add("banana"); 
list.add("banana"); 
list.add("mango"); 

Вывод, который я ожидал это

apple:3 
banana:2 
mango:1 

Однако выход, который идет, составляет

apple:1 
banana:1 
mango:1 

Что мне здесь не хватает?

+2

попробовать ++ numOccurence вместо – u6f6o

+0

'х ++' 'x' приращений * после * он назначен, а не раньше. –

ответ

1

Я думаю, что вам нужно изменить

occurrenceMap.put(obj, numOccurrence++);

в

occurrenceMap.put(obj, numOccurrence + 1); или occurrenceMap.put(obj, ++numOccurrence);

numOccurrence++ увеличит numOccurrence после заявления. И он никогда не будет использоваться, поскольку numOccurrence будет повторно назначен в следующий раз, когда цикл пройдет.

2

Вы должны изменить логику в своей части еще

occurrenceMap.put(obj, ++numOccurrence); 

Поскольку пост инкремент

numOccurrence ++ 

Возвращает значение numOccurrence и затем увеличивает значение numOccurrence «сек на 1. Таким образом, вы не помещая последнюю на карте.

+0

Большое спасибо! Это такая глупая ошибка: P – user1278265

0

Вы можете попробовать таким образом:

List<String> list = new ArrayList<String>(); 
list.add("apple"); 
list.add("apple"); 
list.add("apple"); 
list.add("banana"); 
list.add("banana"); 
list.add("mango"); 

Set<String> unique = new HashSet<String>(list); 
for (String key : unique) { 
System.out.println(key + ": " + Collections.frequency(list, key)); 
} 

Выход:

banana: 2 
apple: 3 
mango: 1 
0

вы также можете использовать следующий фрагмент кода, чтобы достичь своей цели.

public static void countOccurrences(Collection<String> list){ 
    Map<String, Integer> occurrenceMap = new HashMap<String, Integer>(); 
    Integer temp; 
    for(String obj: list){ 
     if((temp = occurrenceMap.put(obj, 1))!= null){ 
      occurrenceMap.put(obj, ++temp); 
     } 
    } 
    for (Map.Entry<String, Integer> entry : occurrenceMap.entrySet()) { 
     System.out.println(entry.getKey()+" : "+entry.getValue()); 
    } 
} 
Смежные вопросы