我有一个函数,它读取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排序操作应该反转这两行(因为前两个字段相等,所以第三个字段决定顺序)。
任何关于如何做到这一点的建议都将不胜感激。
答:阿诺德·德诺耶的回答让我找到了以下通用解决方案
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;
}
};注意:这假设被比较的行有相同的列数,在我的例子中,这是一个有效的假设。
发布于 2015-03-19 11:48:53
是的,比较器是对列表进行排序的方法。在对List<List<String>>进行排序时,需要一个Comparator<List<String>>。
在Java < 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);发布于 2015-03-19 11:38:01
您想要使用比较器。另一方面,如果您的列总是相同的、固定的(如您的示例所示),您可以创建一个class Person、扩展可比较的并且拥有一个ArrayList<Person>,这在一般情况下更好。特别是,如果您希望这些日期是实际的Date对象,而不是Strings。
发布于 2015-03-19 11:39:30
您应该考虑使用容器自动排序,如TreeMap或“TreeSet”。
http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
您可以根据自己的需要实现比较器接口来自定义排序。
https://stackoverflow.com/questions/29143472
复制相似问题