Java: как использовать пару ключей для HashMap - PullRequest
0 голосов
/ 12 августа 2011

Из базы данных sql я читаю таблицу с 2 полями: appName, user.Поэтому я могу видеть:

+-------------+
| appA | John |
+-------------+
| appB | Mary |
+-------------+
| appC | Tom  |
+-------------+
| appA | John |
+-------------+
| appA | Mary |
+-------------+

Каждая из этих записей хранится как объект AppClass с appName и user.Теперь я хочу перечислить, сколько раз приложения запускались разными пользователями.Итак:

+-----------------+
| appA | John | 2 |
+-----------------+
| appA | Mary | 1 | 
+-----------------+
| appB | Mary | 1 |  
+-----------------+
| appC | Tom  | 1 | 
+-----------------+

Возможно ли подсчет с помощью HashMap с 2 ключами?

Ответы [ 5 ]

5 голосов
/ 12 августа 2011

Да.Создайте пару, которая правильно реализует hashCode() и equals() и используйте ее в качестве типа ключа.Если вы используете библиотеку, такую ​​как Apache Commons, вы, вероятно, можете найти там класс пары или кортежа, но в противном случае будет работать нижеприведенное.Можно определить ключевой класс для обработки отношений между парой элементов в коллекции, но у многих есть принципиальные возражения против широкого использования парных классов в Java.для a и b в карту, просто сделайте

myMap.put(new PairKey(a, b), value)
5 голосов
/ 12 августа 2011

Да, возможно, создайте класс AppUser, который включает appName и пользователя. Переопределите hashCode() и equals() для вашего AppUser класса.

Затем вы можете использовать:

Map<AppUser, Integer> map;
3 голосов
/ 12 августа 2011

как насчет

Map<String, Integer> appUserToCountMap

используйте appA:John в качестве ключа, например

2 голосов
/ 12 августа 2011

Да, у вас может быть такая структура:

Map<String, Map<String, Integer>>
       ^           ^       ^
       appName    user    count

Но было бы намного проще, если бы вы просто собирали агрегированные данные непосредственно из базы данных:

SELECT appName, user, COUNT(*)
FROM table
GROUP BY appName, user;
0 голосов
/ 12 августа 2011

Вы также можете использовать сумку Commons Collections '. См Bag.getCount(key)

...