如何在java中存储,排序和分组项目(列表/设置/映射)?

时间:2012-01-21 21:14:14

标签: java sorting grouping store

鉴于此类数据

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

2 个答案:

答案 0 :(得分:2)

您应该创建一个包含三个数据的类。然后实现Comparator。 因此,例如,如果在包含数据的类中,您有三个getter,例如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;
}

答案 1 :(得分:1)

对于非常具体的解决方案,您可以拥有Map<Integer, Map<Integer, Integer>>

第一个Map将UserID存储到将MovieTypes存储到MoviesSeenPerYear的地图。

如果您使用TreeMap作为基础类型,则所有内容都将自动按数字排序。

但这不会非常灵活 - 例如,如果你想通过MovieType而不是UserId进行重新排序会很困难。


回应你的评论:

您将有两个主要限制:

  1. 所有Java集合类都基于int大小(与Java的数组索引器相同),其最大大小为just under 2 ^ 31-1或2,147,483,647 - 或刚刚结束20亿条目。
  2. JVM /计算机的内存限制。
  3. 如果您正在考虑使用这么多数据,并希望有更灵活的排序要求,建议您使用实际数据库 - 标准数据库之一,或者甚至是嵌入JVM的数据库H2Apache Derby