首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ArrayList<ArrayList<String>>排序为行字段

将ArrayList<ArrayList<String>>排序为行字段
EN

Stack Overflow用户
提问于 2015-03-19 11:32:02
回答 5查看 233关注 0票数 0

我有一个函数,它读取CSV文件,经过一些处理后,将数据放入ArrayList<ArrayList<String>>中。

所以我有这个:

代码语言:javascript
复制
  ArrayList = list of rows
  sub-ArrayList<String> = list of columns

现在我必须这样做(我猜java的方法是使用Comparator):我需要根据每个字段的字符串值对这些行进行排序。

因此,例如,如果我有行(其中每个字段都是ArrayList<ArrayList<String>>结构中的最后字符串):

代码语言:javascript
复制
Name|Birthdate|FathersName
John,2001-01-01,Steven
John,2001-01-01,Albert

排序操作应该反转这两行(因为前两个字段相等,所以第三个字段决定顺序)。

任何关于如何做到这一点的建议都将不胜感激。

答:阿诺德·德诺耶的回答让我找到了以下通用解决方案

代码语言:javascript
复制
private Comparator<List<String>> comparator = new Comparator<List<String>>() {
      @Override
      public int compare(List<String> list1, List<String> list2) {
          int size = list1.size();
          int diff = 0;
          for (int i=0; i<size; i++) {
              diff = list1.get(i).compareTo(list2.get(i));
              if (diff != 0) {
                  break;
              }
          }
          return diff;
      }
};

注意:这假设被比较的行有相同的列数,在我的例子中,这是一个有效的假设。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-03-19 11:48:53

是的,比较器是对列表进行排序的方法。在对List<List<String>>进行排序时,需要一个Comparator<List<String>>

在Java < 8中,创建Comparator的匿名实现:

代码语言:javascript
复制
Comparator<List<String>> comparator = new Comparator<List<String>>() {
  @Override
  public int compare(List<String> o1, List<String> o2) {
    int diff = o1.get(0).compareTo(o2.get(0));
    if (diff == 0) {
      diff = o1.get(1).compareTo(o2.get(1));
      if (diff == 0) {
        diff = o1.get(2).compareTo(o2.get(2));
      }
    }
    return diff;
  }
};

在Java 8中,您可以更轻松地编写:

代码语言:javascript
复制
Comparator<List<String>> comparator =
    Comparator.comparing((List<String> l) -> l.get(0))
        .thenComparing((List<String> l) -> l.get(1))
        .thenComparing((List<String> l) -> l.get(2));

然后分类:

代码语言:javascript
复制
Collections.sort(list, comparator);
票数 1
EN

Stack Overflow用户

发布于 2015-03-19 11:38:01

您想要使用比较器。另一方面,如果您的列总是相同的、固定的(如您的示例所示),您可以创建一个class Person、扩展可比较的并且拥有一个ArrayList<Person>,这在一般情况下更好。特别是,如果您希望这些日期是实际的Date对象,而不是Strings

票数 3
EN

Stack Overflow用户

发布于 2015-03-19 11:39:30

您应该考虑使用容器自动排序,如TreeMap或“TreeSet”。

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

您可以根据自己的需要实现比较器接口来自定义排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29143472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档