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

为了避免重复索赔 ,我看过这篇文章并不是我想要的。
每个其他2D ArrayList问题都涉及doubleint数字; 我的问题是关于Strings

我在做什么

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

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

我们的想法是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作为输入创建了一个排序数组方法,我会没事的。 我没有看到任何明确回答这个问题的问题。 我将继续尝试自己提出答案

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

 List> namesAndNumbers = new ArrayList>(); namesAndNumbers.add(new ArrayList(Arrays.asList("Mike", "(805) 766-4920"))); namesAndNumbers.add(new ArrayList(Arrays.asList("Emily", "(705) 668-9292", "(705) 555-1060"))); namesAndNumbers.add(new ArrayList(Arrays.asList("James", "(605) 965-2000"))); Collections.sort(namesAndNumbers, new Comparator>() { @Override public int compare(ArrayList o1, ArrayList 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]] 

创建自定义比较器:

 final Comparator> comparator = new Comparator>() { public int compare(List pList1, List pList2) { return pList1.get(0).compareTo(pList2.get(0)); } }; final List> 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 list : lists) System.out.println(list); 

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

 String name="John"; ArrayList phonenumbers=new ArrayList(); phonenumbers.add("80925887"); phonenumbers.add("+166476654"); TreeMap tm=new TreeMap(); tm.put(name, phonenumbers);