我想在Java中实现一个快速的“分组依据”功能。
我有一个List<List<String>>
,我希望根据不同的索引进行迭代。
例如:
A1 B1 C1 value_1 A1 B1 C2 value_2 A1 B2 C1 value_3 A1 B2 C2 value_4
我想在第一列和第三列使用灌浆进行一些聚合。 而且我希望它快速 - 避免在每个查询中计算每个总和。 “表”中的值不断变化。 有什么想法吗?
答案 0 :(得分:1)
听起来最简单(编程最少)的方法就是使用SQL数据库。您可以使用in-memory SQLite数据库。适用于SQLite的最佳Java库来自Xerial.org。
答案 1 :(得分:1)
一些注意事项:首先,您需要为要对商品进行排序的每个订单设置自定义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
。如果更改地图中现有元素的比较器值,则只会使其无效。
答案 2 :(得分:0)
Java不适合这项任务。我宁愿选择内存中的SQL数据库。首先将值转储到表中,然后使用select
SQL语句分组,按不同列排序或求和来检索行。