2014-12-02 3 views
2

У меня есть хэш-карта, которая выглядит следующим образом:Подсчет повторяющихся значений в Hashmap

HashMap<String, ArrayList<String>> varX = new HashMap<String, ArrayList<String>>(); 

И я не могу за жизнь мне работать, как подсчитать количество повторяющихся значений. Например, если put("001", "DM"); в хэш-карте и put("010", "DM");, как можно подсчитать, есть ли два значения int в разделе ArrayList в Hashmap.

Например, вывод будет выглядеть примерно так:

DM:2, как я поставил "два значения DM в Hashmap.

+9

Вы не можете 'ставить ("001", "DM");'. '' DM "' не является 'ArrayList '. Что вы на самом деле имеете в виду? –

+1

Вы можете использовать второй HashMap для подсчета? – Compass

+1

Вы должны определенно проверить [Guava Multimap] (https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap). Он хранит «Collection» в качестве значения, но вам не нужно об этом заботиться. Вы можете просто написать 'multiMap.put (« DM »,« 123 »);'. И помните, что вы должны переключить свой * ключ * и * значение *. 'DM' должен быть * ключ *. – Tom

ответ

0

Как говорит Сотириос, вы можете установить ArrayList.

ArrayList<String> names= new ArrayList<String>(); 
names.add("Josh"); 
put("001", names); 

Если вы хотите вставить строки в HashMap, определить его следующим образом:

Map<String,String> example = new HashMap<String,String>(); 
example.put("001", new String("Rooney")); 

С уважением,

+2

почему новый String («Руни»)? что случилось с «Руни»? – dragon66

+0

Оба могут быть использованы без проблем: мне нравится создавать объект String, потому что в HashMap он определен как класс String. И я предпочитаю это, вот и все :) – MartaGom

+0

Использование строкового литерала '' Руни'' также создаст объект 'String'. Все, что вы сделали, это создать пустой пул-объект. – ajb

1

У вас есть HashMap, переводящий String к ArrayList<String>.

Выполнение put("001", "DM") на этой карте не будет работать, как указано в комментариях от @Sotirios Delimanolis.

Вы можете получить ошибку, которая выглядит как:

The method put(String, ArrayList<String>) in the type HashMap<String,ArrayList<String>> is not applicable for the arguments (String, String) 

Основываясь на вашем примере поведения, вы хотите HashMap, который отображает String на String (т.е. put("001", "DM");

Теперь, если у вас есть что:

HashMap<String, String> varX = new HashMap<String, String>(); 

И вы хотите сосчитать , сколько ключей указано на карте такое же значение, вот как вы можете сделать это:

varX.put("001", "DM"); 
varX.put("010", "DM"); 

// ... 

int counter = 0; 
String countingFor = "DM"; 
for(String key : varX.keySet()) {   // iterate through all the keys in this HashMap 
    if(varX.get(key).equals(countingFor)) { // if a key maps to the string you need, increment the counter 
     counter++; 
    } 
} 
System.out.println(countingFor + ":" + counter); // would print out "DM:2" 
0

Collections.frequency(map, "value"); используется для подсчета пройденного объекта в коллекции. Ниже приводится объявление этого метода:

public static int frequency(Collection<?> c, Object o) 
0
HashMap hm =new HashMap(); 
hm.put("01","one"); 
hm.put("02","two"); 
hm.put("03","one"); 
hm.put("04","one"); 
hm.put("05","two"); 
HashMap newHm = new HashMap(); 
     Iterator it = hm.entrySet().iterator(); 
      while (it.hasNext()) { 
       Map.Entry pair = (Map.Entry)it.next(); 
       System.out.println(pair.getKey() + " = " + pair.getValue()); 
       if(newHm.containsKey(pair.getValue())){ 
        newHm.put(pair.getValue(), Integer.parseInt(newHm.get(pair.getValue()).toString())+1); 
       }else{ 
        newHm.put(pair.getValue(),1); 
       } 
       it.remove(); // avoids a ConcurrentModificationException 
      } 
+0

Пожалуйста, добавьте некоторое объяснение в свой ответ. –

+0

Выход: если вы печатаете свой новый Hm, вы получаете «один» -3, «два» -2. –

+0

Эй, может быть, я знаю, что код полезен? –

Смежные вопросы