我想在 Java 中实现一个快速的“分组依据”功能。我有一个List<List<String>>
并且我想根据不同索引的分组进行迭代。
例如:
A1 B1 C1 value_1 A1 B1 C2 value_2 A1 B2 C1 value_3 A1 B2 C2 value_4
我想要在第一列和第三列上使用分组进行一些聚合。而且我希望它快速 - 避免在每个查询中计算每个总和。“表”中的值不断变化。有什么想法吗?
我想在 Java 中实现一个快速的“分组依据”功能。我有一个List<List<String>>
并且我想根据不同索引的分组进行迭代。
例如:
A1 B1 C1 value_1 A1 B1 C2 value_2 A1 B2 C1 value_3 A1 B2 C2 value_4
我想要在第一列和第三列上使用分组进行一些聚合。而且我希望它快速 - 避免在每个查询中计算每个总和。“表”中的值不断变化。有什么想法吗?
听起来最简单(最少编程)的方法是使用 SQL 数据库。您可以使用内存中的 SQLite数据库。SQLite 的最佳 Java 库来自Xerial.org。
一些注意事项:首先,您需要 Comparator
为您想要将商品分类到的每个订单进行自定义。假设您的对象是Foo
实例,那么您将拥有
class FirstComparator implements Comparator<Foo> {
public int compareTo(Foo o1, Foo o2) {
...
}
}
class SecondComparator implements Comparator<Foo> {
public int compareTo(Foo o1, Foo o2) {
...
}
}
等等。
然后,您将能够使用 轻松对集合进行排序Collections.sort(fooList, yourComparator)
。
这里的问题是您想要许多自定义排序顺序并且您希望动态更新。我在这里建议的最佳想法是拥有许多包含相同项目的不同集合,并且已经按顺序排列。
你可以这样做,例如:
TreeMap<Foo> firstOrder = new TreeMap<Foo>(new FirstComparator<Foo>());
TreeMap<Foo> secondOrder = new TreeMap<Foo>(new SecondComparator<Foo>());
现在,当您将一个项目添加到集合中时,您只需将其添加到两个集合中,它们就会自动排序,您不必对它们调用排序,并且在添加或删除元素时会动态更新。唯一的额外重量是您将对对象的引用增加一倍,因此您正在用空间换取速度。
请注意,如果列值在添加到树后发生更改,这将不起作用,因为这将需要对TreeMap
必须显式调用的整体进行重新排序。如果您更改地图中现有元素的比较器值,您只会使其无效。
Java 不太适合该任务。我宁愿使用内存中的 SQL 数据库。首先将值转储到表中,然后使用select
SQL 语句按不同列分组、排序或求和检索行。