【问题标题】:How to store, sort and group items (list/set/map) in java?如何在java中存储、排序和分组项目(列表/集合/地图)?
【发布时间】:2012-02-15 22:09:42
【问题描述】:

鉴于这样的数据

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 和电影类型对它们进行分组

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

【问题讨论】:

  • 您正在寻找通用解决方案,您可以在其中更改 groupby 等或仅针对此特定问题?
  • 目前特殊的bur学习一般的sol会更好

标签: java sorting grouping store


【解决方案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

【讨论】:

  • 我是java新手,遇到了SortedSet set = new TreeSet();地图是更好的选择?
  • @tnaser - Set 只存储项目 - 没有键/值来存储关联。 Map 具有存储关联的键/值。如果您想使用我的解决方案,您需要 TreeMap 来存储键/值关联。但是,TreeMap 和 TreeSet 都允许将自定义比较器作为其构造函数的一部分提供。您实际上可以将其与 Fortunato 的回答一起使用(我 +1!)。通过使用 Set 而不是 List ,您根本不需要调用 Collections.sort - Set 会自动排序并保持自己排序。
  • Set、Map、List 的大小是否有限制?例如数百万条数据?
【解决方案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;
}

【讨论】:

  • 实际上,对于您想要进行的排序,只有一个比较器可以比较三个数据,一次一个。请参阅答案中的编辑...
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多