排序ArrayList <arraylist <string>&gt;作为行字段</arraylist <string>

时间:2015-03-19 11:32:03

标签: java sorting arraylist

我有一个读取CSV文件的功能,经过一些处理后将数据放入 ArrayList<ArrayList<String>>

所以我有这个:

  ArrayList = list of rows
  sub-ArrayList<String> = list of columns

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

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

Name|Birthdate|FathersName
John,2001-01-01,Steven
John,2001-01-01,Albert

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

非常感谢有关如何执行此操作的任何提示。

答案:Arnaud Denoyelle的回答让我得到了以下通用解决方案

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;
      }
};

注意:这假设被比较的行具有相同的列数,在我的情况下这是有效的假设。

5 个答案:

答案 0 :(得分:3)

您想使用comparators。 另一方面,如果您的列始终相同并且具有固定数字(如您的示例所示),则可以创建class Person,扩展Comparable并拥有ArrayList<Person>,这通常更好。特别是例如,如果您希望这些日期是实际Date个对象而不是Strings

答案 1 :(得分:1)

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

在Java&lt; 8,创建Comparator的匿名实现:

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开始,您可以更轻松地编写它:

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));

然后排序:

Collections.sort(list, comparator);

答案 2 :(得分:0)

您应该考虑使用自动排序的容器,例如TreeMap或&#39; TreeSet&#39;。

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

您可以根据自己的需要实施Comparator界面来自定义排序。

答案 3 :(得分:0)

Java版本&lt; 8:可以使用ComparatorCollections.sort()

Java版本&gt; = 8:可以使用Lambda Expressions

答案 4 :(得分:0)

这是一个带有通用Comparator&gt;

的java示例
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ArrayListComparator {

    public static void main(String[] args) {
        ArrayList<String> one=new ArrayList<>();
        one.add("John");one.add("2001-01-01"); one.add("Steven");
        ArrayList<String> two=new ArrayList<>();
        two.add("John");two.add("2001-01-01"); two.add("Albert");
        List<ArrayList<String>> container=new ArrayList<ArrayList<String>>();
        container.add(one);
        container.add(two);
        Collections.sort(container, new ArrayComparator());
        System.out.println(container.get(0).get(2));


    }

    public static class ArrayComparator implements Comparator<List<String>> {

        @Override
        public int compare(List<String> o1, List<String> o2) {
            if (o1!=null && o2!=null) {
                for (int index=0; index<o1.size(); index++ ) {
                    if (index<o2.size()) {
                        String o1Element=o1.get(index);
                        String o2Element=o2.get(index);
                        if (o1Element!=null) {
                            int result=o1Element.compareTo(o2Element);
                            if (result!=0) {
                                return result;
                            }
                        } else {
                            return -1;
                        }
                    } else {
                        return 1;
                    }
                }
                if (o2.size()>o1.size()) {
                    return -1;
                }
                return 0;
            }
            if (o1==null && o2!=null) {
                return -1;
            }
            if (o1!=null && o2==null) {
                return 1;
            }           
            return 0;
        }

    }

}

正如其他人用java 8所说,你可以使用lambda表达式。