2

我想在 Java 中实现一个快速的“分组依据”功能。我有一个List<List<String>>并且我想根据不同索引的分组进行迭代。

例如:

A1 B1 C1 value_1 A1 B1 C2 value_2 A1 B2 C1 value_3  A1 B2 C2 value_4

我想要在第一列和第三列上使用分组进行一些聚合。而且我希望它快速 - 避免在每个查询中计算每个总和。“表”中的值不断变化。有什么想法吗?

4

3 回答 3

1

听起来最简单(最少编程)的方法是使用 SQL 数据库。您可以使用内存中的 SQLite数据库。SQLite 的最佳 Java 库来自Xerial.org

于 2012-04-05T13:01:19.640 回答
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必须显式调用的整体进行重新排序。如果您更改地图中现有元素的比较器值,您只会使其无效。

于 2012-04-05T13:01:30.750 回答
0

Java 不太适合该任务。我宁愿使用内存中的 SQL 数据库。首先将值转储到表中,然后使用selectSQL 语句按不同列分组、排序或求和检索行。

于 2012-04-05T13:00:51.837 回答