1

我有一个 ArrayList ,它由一个由 Strings: 组成的 ArrayList 组成ArrayList<ArrayList<String>>。如何对内部 ArrayList 的第一个条目进行排序?例如我想要这样:

a = [['1','apple'],['3','pear'],['2','banana'],['1',orange']]

成为:

a_sorted = [['1','apple'],['1','orange'],['2','banana'],['3','pear']]

重复的第一个条目(如appleorange)的顺序无关紧要。我试过使用Collections.sort(a,new ColumnComparator()),但它不会接受 ArrayLists。这是我使用的类:

public class ColumnComparator implements Comparator<ArrayList<String>>{
    public int compare(ArrayList<String> ar1, ArrayList<String> ar2){
        return ar1.get(0).compareTo(ar2.get(0));
    }
}
4

4 回答 4

2

您可以使用 ArrayLists 的Map <String, ArrayList<String>>第一个条目作为键,将 ArrayList 本身作为值来创建一个。然后在键上对 Map 进行排序(使用Sorted MapComparator对 Map 键进行排序),您将得到您想要的。

于 2013-04-17T15:42:51.927 回答
2

您为什么不创建一个实现Comparable的自定义类,而不是存储一个数组的数组。例如。

class Fruit implements Comparable<Fruit> {
protected int number;
protected String name;

public Fruits(int number, String name) {
    this.number = number;
    this.name = name;
}

@Override
public int compareTo(Fruit f) {
    return number < f.number;
    // or depending on if ascending or descending order wanted
    // return number > f.number 
}
}

然后排序只是运行Collections.sort(a)。这种方式灵活且易于扩展。

于 2013-04-17T15:47:24.370 回答
0

为什么不能使用 thisArrayList<Map<String,String>>而不是ArrayList<ArrayList<String>>. 您可以使用 TreeMap 轻松地对键上的 Map 进行排序。注意:这仅在您的内部数组列表中只有两个条目时才有效。

于 2013-04-17T15:44:09.203 回答
0

如果你真的想这样做,你可以试试这个:

import java.util.Comparator;

public class ColumnComparable implements Comparator<ArrayList<String>>{

    @Override
    public int compare(ArrayList<String> o1, ArrayList<String> o2) {
        return (Integer.parseInt(o1.get(0)) > Integer.parseInt(o2.get(0)) ? -1 : (Integer.parseInt(o1.get(0)) == Integer.parseInt(o2.get(0)) ? 0 : 1));
    }
}

代码在这里找到。

于 2013-04-17T16:06:56.533 回答