2012-01-21 39 views
2

鑑於這些數據如何在java中存儲,排序和分組項目(列表/設置/映射)?

UserID, MovieType , year 
1, 2, 2000 
1, 3, 2000 
1, 2, 2006 
2, 3, 2010 
2, 4, 2011 
2, 3, 2002 
1, 2, 2010 

什麼是將其存儲在Java中的最佳選擇,這樣我可以根據第一列第三,然後對它進行排序,然後第二列?

UserID, MovieType , year 
1, 2, 2000 
1, 2, 2006 
1, 2, 2010 
1, 3, 2000 
2, 3, 2002 
2, 3, 2010 
2, 4, 2011 

然後通過用戶ID組他們,Movietype

UserID, MovieType , movies seen per year 
1, 2, 3 
1, 3, 1 
2, 3, 2 
2, 4, 1 
+0

你正在尋找通用SOLN在那裏你可以改變GROUPBY等,或只是爲這個特殊的問題? – havexz

+0

目前特別是學習一般溶膠bur將更好 – tnaser

回答

1

對於一個非常具體的解決方案,你可以有一個Map<Integer, Map<Integer, Integer>>

第一個Map將UserID存儲到一個將MovieTypes存儲到MoviesSeenPerYear的地圖。

如果您使用TreeMap作爲基礎類型,則所有內容都將自動進行數字排序。

雖然這不會很靈活 - 例如,如果您想按MovieType而不是UserId進行重新排序,將會很困難。


在回答您的評論:

你將有2個主要侷限:

  1. 所有Java集合類是基於int尺寸(如Java的數組索引相同)的,其最大尺寸爲just under 2^31-1或2,147,483,647 - 或者超過20億條目。
  2. JVM /機器的內存限制。

如果您正在處理這麼多的數據,並希望更靈活的排序要求,建議您使用實際的數據庫 - 無論是標準數據庫還是JVM - 嵌入一​​個像H2Apache Derby

+0

我新的Java和遇到SortedSet set = new TreeSet();地圖是更好的選擇? – tnaser

+0

@tnaser - 一個集只存儲項目 - 沒有鍵/值來存儲關聯。地圖有鍵/值來存儲關聯。如果你想使用我的解決方案,你需要TreeMap來存儲鍵/值關聯。但是,TreeMap和TreeSet都允許將自定義比較器作爲其構造函數的一部分提供。你可以在Fortunato的答案中使用這個(我的+1!)。通過使用Set來代替List,你不需要調用'Collections。排序「 - Set會自動排序並保持排序。 – ziesemer

+0

Set,Map,List的大小是否有限制?例如數百萬的數據? – tnaser

2

您應該創建一個包含三條數據的類。然後執行Comparator。 因此,例如,如果在包含數據的類中,您有三個獲得者,例如int getUserId(),int getMovieType()int getYear()。 然後,您可以將數據對象存儲在List中,並使用比較器和Collections.sort(List<T> list, Comparator<T> comparator)一起對此列表進行排序。

比較應該這樣做:

public int compare(DataObject data1, DataObject data2) { 
    int comparison = data1.getUserId() - data2.getUserId(); 
    if (comparison == 0) { 
     comparison = data1.getMovieType() - data2.getMovieType(); 
     if (comparison == 0) { 
      comparison = data1.getYear() - data2.getYear(); 
     } 
    } 
    return comparison; 
} 
+0

其實對於你想要做的排序,只有一個比較器可以比較三個數據,每次只有一個。請參閱答案中的修改... – Fortunato