2013-04-17 26 views
1

我有一个ArrayList,它包含一个ArrayList,它是Strings的常量:ArrayList<ArrayList<String>>。我如何排序内部ArrayList的第一个条目?例如,我想这样的:在ArrayList中排序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)); 
    } 
} 
+0

'Collections.sort'应该接受ArrayLists。你是在传递一个ArrayList还是一个ArrayList ? –

+0

你会得到什么错误? – WilQu

+0

对元素的自然顺序进行排序,排序。这些子阵列没有自然顺序。 –

回答

2

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

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)。这种方式灵活且容易扩展。

+0

这似乎是一个好主意,我会试试看。 – Tim

+0

最后我想到了这个想法,因为它确实非常容易扩展。这也给了我解决其他问题的想法。 – Tim

2

您可以使用的ArrayList的第一项关键和ArrayList的本身价值创造Map <String, ArrayList<String>>。然后在键上对地图进行排序(使用Sorted MapComparator对键进行排序),您将得到您想要的。

+0

我虽然对此有所了解,但是您可能会看到,必须对其进行排序的字符串并非唯一(即使其余条目的组合)。这不会搞乱地图吗? – Tim

+1

你是对的。在这种情况下,使用Map >,这将解决非唯一的第一个条目的问题。在将键值对插入到映射中之前,请检查值是否存在,以及是否存在..只需将ArrayList添加到已存储在映射中的ArrayList列表中即可。 – Suchet

+0

这实际上可能是一个好主意。我会试一试 – Tim

0

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

+0

这仅仅是一个例子,我的内部ArrayList实际上更大。 – Tim

+0

仍然可以做的是用Map >替换你的内部ArrayList。在这里,内部Arraylist的第一个元素可以用作地图的关键字,并作为值(列表)。使用TreeMap,您将能够轻松地对第一个值的元素进行排序。 –

+0

这不会造成太多的开销吗?因为我将以这种方式创建很多地图。 – Tim

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