我有一个ArrayList,它由一个由字符串组成的ArrayList组成:ArrayList<ArrayList<String>>
。如何对内部ArrayList的第一个条目进行排序?例如,我想这样:
a = [['1','apple'],['3','pear'],['2','banana'],['1',orange']]
成为:
a_sorted = [['1','apple'],['1','orange'],['2','banana'],['3','pear']]
重复的第一个条目(如apple
和orange
)的顺序无关紧要。我已尝试使用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));
}
}
答案 0 :(得分:2)
您可以创建 Map <String, ArrayList<String>>
,将ArrayLists的第一个条目作为键,将ArrayList本身作为值。然后对按键排序地图(使用Sorted Map或Comparator按地图键排序),您将得到您想要的结果。
答案 1 :(得分: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)
。这种方式灵活且易于扩展。
答案 2 :(得分:0)
为什么不能使用此ArrayList<Map<String,String>>
代替ArrayList<ArrayList<String>>
。您可以使用TreeMap轻松地在键上对Map进行排序。
注意:这仅在内部arraylist中只有两个条目时才有效。
答案 3 :(得分: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));
}
}
找到了代码here。