2011-08-11 48 views
0

從sql數據庫中,我正在閱讀一個有兩個字段的表:appName,user。所以我可能會看到:Java:如何使用HashMap的一對密鑰

+-------------+ 
| 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進行計數?

+0

爲什麼不在SQL – Mark

回答

2

是的,你可以像下面這樣的結構:

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

但如果您直接從數據庫中獲取彙總數據,則會更加容易:

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

怎麼樣

Map<String, Integer> appUserToCountMap 

使用appA:John,例如

+0

中做「髒」,但是... +1 – 2011-08-11 21:24:29

+2

這對於除了最有限的情況之外的任何事情都是相當危險的模式。 – biziclop

+0

大家都很開心,直到一個名爲「app1:v2.1」的應用出現。 – Rekin

5

是的,它是可能的密鑰,創建一個AppUser類,包含應用程序的名字和用戶。爲您的AppUser課程重寫hashCode()equals()

然後,您可以使用:

Map<AppUser, Integer> map; 
5

是的。創建一個適當執行hashCode()equals()並將其用作鍵類型的對。如果你使用像apache commons這樣的庫,那麼你可能會在那裏找到一對或者tuple類,但是否則下面的代碼就可以工作了。

儘管不要過度使用通用對。定義一個關鍵類來處理一個集合中的一對項目之間的關係是很好的,但是很多人對在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)); 
    } 
} 

,然後放了一個條目和b到地圖,只是做

myMap.put(new PairKey(a, b), value) 
相關問題