如何通过仅第一个元素</string>对2D ArrayList <string>进行排序

时间:2013-12-09 21:03:03

标签: java sorting arraylist

为了避免重复声明,我查看了this帖子,这不是我想要的。
每个其他2D ArrayList问题涉及doubleint个数字;我的问题是关于Strings

我正在做什么

我有一个2D ArrayList,定义如下:

ArrayList<ArrayList<String>> namesAndNumbers = new ArrayList<ArrayList<String>>();

这个想法是ArrayLists的每一行中的第一项包含名称,每行中的其余列包含电话号码(未知数量)。因此,我想避免将其转换为常规数组。

示例

假设我填充了我的ArrayList,我有这个:

{"Mike", "(805) 766-4920"}
{"Emily", "(705) 668-9292", "(705) 555-1060"}
{"James", "(605) 965-2000"}

我希望我的输出是这样的:

{"Emily", "(705) 668-9292", "(705) 555-1060"}    
{"James", "(605) 965-2000"}
{"Mike", "(805) 766-4920"}

我想保留与名称对应的数字,但只需按名称对数组进行排序。

我希望

得到什么答案

我希望有一个内置的函数操作类型的东西,但如果有人用2D ArrayList作为输入创建了一个排序数组方法,我会没事的。我没有看到任何明确回答这个问题的问题。 我将继续尝试自己提出答案

3 个答案:

答案 0 :(得分:12)

您可以使用Collections.sort并提供自定义Comparator,您可以在其中比较每个列表的第一个元素,即名称:

List<ArrayList<String>> namesAndNumbers = new ArrayList<ArrayList<String>>();
namesAndNumbers.add(new ArrayList<String>(Arrays.asList("Mike", "(805) 766-4920")));
namesAndNumbers.add(new ArrayList<String>(Arrays.asList("Emily", "(705) 668-9292", "(705) 555-1060")));
namesAndNumbers.add(new ArrayList<String>(Arrays.asList("James", "(605) 965-2000")));
Collections.sort(namesAndNumbers, new Comparator<ArrayList<String>>() {    
        @Override
        public int compare(ArrayList<String> o1, ArrayList<String> o2) {
            return o1.get(0).compareTo(o2.get(0));
        }               
});
System.out.println(namesAndNumbers);

输出:

[[Emily, (705) 668-9292, (705) 555-1060], [James, (605) 965-2000], [Mike, (805) 766-4920]]

答案 1 :(得分:3)

创建自定义比较器:

final Comparator<List<String>> comparator = new Comparator<List<String>>() {
    public int compare(List<String> pList1, List<String> pList2) {
        return pList1.get(0).compareTo(pList2.get(0));
    }
};
final List<List<String>> lists = Arrays.asList(
    Arrays.asList("Mike", "(805) 766-4920"),
    Arrays.asList("Emily", "(705) 668-9292", "(705) 555-1060"),
    Arrays.asList("James", "(605) 965-2000")
);
Collections.sort(lists, comparator);
for (List<String> list : lists) System.out.println(list);

答案 2 :(得分:1)

对于多样性为什么不使用HashMap,除非你想要重复的键。 键将是name,值将是数字的ArrayList

String name="John";

ArrayList<String> phonenumbers=new ArrayList<String>();

phonenumbers.add("80925887");
phonenumbers.add("+166476654");

TreeMap<String, ArrayList> tm=new TreeMap<String, ArrayList>();

tm.put(name, phonenumbers);