Как получить подсчет одинаковых значений из HashMap? - PullRequest
8 голосов
/ 25 февраля 2011

Как рассчитать те же значения из HashMAP?

HashMap<HashMap<String, Float>, String> HM=new HashMap<HashMap<String,Float>, String>(); 

HashMap<String, Float> h;

h=new HashMap<String, Float>();                          
h.put("X", 48.0f);
h.put("Y", 80.0f);    
HM.put(typeValuesHM, "Red");

h=new HashMap<String, Float>();
h.put("X", 192.0f);
h.put("Y", 80.0f);
HM.put(typeValuesHM, "Red");

h=new HashMap<String, Float>();
h.put("X", 192.0f);
h.put("Y", 320.0f);
HM.put(typeValuesHM, "Blue");

h=new HashMap<String, Float>();
h.put("X", 336.0f);
h.put("Y", 560.0f);
HM.put(typeValuesHM, "Blue");

Значения моего HashMap HM следующие:

{ {x=48,y=80}=Red,{x=192,y=80}=Red,{x=192,y=320}=Blue,{x=336,y=560}=Blue }

Здесь,

Iхочу посчитать аналогичные значения в HashMap HM.

т.е.), если я даю значение, равное «Красному», значит, я хочу получить count = 2.если я даю значение, равное «Синему», значит, я хочу получить count = 2.

Как получить те же значения из HashMAP HM?

Ответы [ 5 ]

11 голосов
/ 10 апреля 2013
int count = Collections.frequency(new ArrayList<String>(HM.values()), "Red");
9 голосов
/ 25 февраля 2011

Перебрать набор записей и сбросить все значения на вторую карту, значение первой карты в качестве ключа, значение будет счетчиком:

Map<String, Integer> result = new TreeMap<String, Integer>();
for (Map.Entry<Map<String, Float>> entry:HM.entrySet()) {
   String value = entry.getValue();
   Integer count = result.get(value);
   if (count == null)
      result.put(value, new Integer(1));
   else
      result.put(value, new Integer(count+1));
}

Карта результатов для вашего примера должна выглядеть следующим образом:

{"Red"=2, "Blue"=2}  // values are stored as Integer objects
2 голосов
/ 25 февраля 2011

Единственный способ сделать это - перебрать все элементы и сосчитать вхождения:

for(String value: hm.values()) {
  if (value.equals(valueToCompare)) {
    count++;
  }
}
0 голосов
/ 25 февраля 2011
    Iterator<String> iter = HM.values().iterator();
    while(iter.hasNext()) {
        String color = iter.next();

        if(color.equals("Red")) {

        } else if(color.equals("Green")) {

        }  else if(color.equals("Blue")) {

        }
    }
0 голосов
/ 25 февраля 2011
int countValue(String toMatch) {
  int count = 0;
  for (String v : HM.values()) {
    if (toMatch.equals(value)) {
      count++;
    }
  }
  return count;
}

Также, возможно, излишне использовать HashMap в качестве ключа, если вы просто храните два значения. Встроенный Point использует int, но его было бы не сложно реализовать с помощью float.

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