Java:如何为HashMap使用一对键

时间:2011-08-11 21:17:17

标签: java sql map hashmap

从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 | 
+-----------------+

是否可以使用带有2个键的HashMap进行计数?

5 个答案:

答案 0 :(得分:5)

是的,可以创建一个包含appName和用户的AppUser类。覆盖hashCode()课程的equals()AppUser

然后您可以使用:

Map<AppUser, Integer> map;

答案 1 :(得分:5)

是。创建一对正确实现hashCode()equals()的对,并将其用作密钥类型。如果您正在使用像apache commons这样的库,那么您可以在那里找到一对或者元组类,但是否则以下内容将会起作用。

不要过度使用通用对。定义一个关键类来处理集合中一对项之间的关系是很好的,但很多人对Java中对配对类的广泛使用有原则性的反对意见。

public final class PairKey<A, B> {
  public final A a;
  public final B b;

  private PairKey(A a, B b) { this.a = a; this.b = b; }

  public static <A, B> PairKey<A, B> make(A a, B b) { return new PairKey<A, B>(a, b); }

  public int hashCode() {
    return (a != null ? a.hashCode() : 0) + 31 * (b != null ? b.hashCode() : 0);
  }

  public boolean equals(Object o) {
    if (o == null || o.getClass() != this.getClass()) { return false; }
    PairKey that = (PairKey) o;
    return (a == null ? that.a == null : a.equals(that.a))
        && (b == null ? that.b == null : b.equals(that.b));
  }
}

然后将a和b的条目放入地图中,只需执行

myMap.put(new PairKey(a, b), value)

答案 2 :(得分:3)

怎么样

Map<String, Integer> appUserToCountMap

使用appA:John作为密钥,例如

答案 3 :(得分:2)

是的,您可以拥有如下结构:

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

但如果你直接从数据库中获取聚合数据会更容易:

SELECT appName, user, COUNT(*)
FROM table
GROUP BY appName, user;

答案 4 :(得分:0)

你也可以考虑使用Commons Collections'Bag。见Bag.getCount(key)