我有一个读取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;
}
};
注意:这假设被比较的行具有相同的列数,在我的情况下这是有效的假设。
答案 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:可以使用Comparator和Collections.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表达式。