Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何为HashMap使用一对键_Java_Sql_Map_Hashmap - Fatal编程技术网

Java:如何为HashMap使用一对键

Java:如何为HashMap使用一对键,java,sql,map,hashmap,Java,Sql,Map,Hashmap,从sql数据库中,我正在读取一个包含两个字段的表:appName、user。因此,我可以看到: +-------------+ | appA | John | +-------------+ | appB | Mary | +-------------+ | appC | Tom | +-------------+ | appA | John | +-------------+ | appA | Mary | +-------------+ 这些记录中的每一条都存储为具有appName和us

从sql数据库中,我正在读取一个包含两个字段的表:appName、user。因此,我可以看到:

+-------------+
| appA | John |
+-------------+
| appB | Mary |
+-------------+
| appC | Tom  |
+-------------+
| appA | John |
+-------------+
| appA | Mary |
+-------------+
这些记录中的每一条都存储为具有appName和user的AppClass的对象。 现在,我想列出不同用户运行这些应用程序的次数。因此:

+-----------------+
| appA | John | 2 |
+-----------------+
| appA | Mary | 1 | 
+-----------------+
| appB | Mary | 1 |  
+-----------------+
| appC | Tom  | 1 | 
+-----------------+
可以用一个有两个键的HashMap进行计数吗?

怎么样

Map<String, Integer> appUserToCountMap

使用appA:John作为键例如

是的。如果可能,创建一个包含appName和user的AppUser类。重写AppUser类的hashCode和equals

然后,您可以使用:

Map<AppUser, Integer> map;

你也可以考虑使用共享集合的包。请参见是。创建一个正确实现hashCode和equals的对,并将其用作密钥类型。如果您使用的是ApacheCommons之类的库,您可能会在那里找到一个pair或tuple类,但除此之外,下面的方法也可以

不过,不要过度使用泛型配对。定义一个键类来处理集合中一对项之间的关系是可以的,但是许多人原则上反对在Java中广泛使用pair类

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));
  }
}

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

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

为什么不使用SQLGroup和sum呢?除了最有限的情况外,这是一种非常危险的模式。每个人都很高兴,直到一个名为app1:v2.1的应用程序出现。
Map<String, Map<String, Integer>>
       ^           ^       ^
       appName    user    count
SELECT appName, user, COUNT(*)
FROM table
GROUP BY appName, user;