鉴于此类数据
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 :(得分: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进行重新排序会很困难。
回应你的评论:
您将有两个主要限制:
int
大小(与Java的数组索引器相同),其最大大小为just under 2 ^ 31-1或2,147,483,647 - 或刚刚结束20亿条目。如果您正在考虑使用这么多数据,并希望有更灵活的排序要求,建议您使用实际数据库 - 标准数据库之一,或者甚至是嵌入JVM的数据库H2或Apache Derby。