使用java地图/列表按类似结构分组

时间:2012-04-05 12:56:51

标签: java data-structures

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

例如:

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

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

3 个答案:

答案 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语句分组,按不同列排序或求和来检索行。