如何仅按第一个元素对 2D ArrayList<String> 进行排序

Posted

技术标签:

【中文标题】如何仅按第一个元素对 2D ArrayList<String> 进行排序【英文标题】:How to Sort 2D ArrayList<String> by Only the First Element [duplicate] 【发布时间】:2013-12-27 03:48:15 【问题描述】:

为避免重复声明,我查看了this 的帖子,这并不是我想要的。 涉及doubleint 数字的所有其他2D ArrayList 问题;我的问题是关于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 作为输入,我会很好。我还没有看到任何明确回答这个问题的问题。 我也将继续尝试自己想出一个答案

【问题讨论】:

您为什么不为此使用 Java 中的集合 - 我认为这对于您的情况来说是一个完美的工具,不是吗? @harikris 它是一个嵌套的 ArrayList。是的,我认为 Collections 可以工作,但我不知道如何处理它。 如果您使用 Collections,那么排序将变得轻而易举。此外,如果您使用 Sets 而不是 Lists,那么您也可以避免重复条目 - 所有这些都是自动为您完成的。学习集合和泛型并不难。我可以推荐一本参考书吗?不确定这是否会被视为促销活动。这本书不是我写的。只是认为这是一个很好的资源。作者是 Kathy Sierra 和 Bert Bates。他们在 Head First Java 书中有一章是关于集合/泛型的。 HTH。 @harikris 您可以提出建议,但我可能不会阅读它来回答这个问题。我目前没有时间立即阅读。不过可能会晚一点。谢谢。 没问题。那一章有一个工作示例。只是让你知道。供以后使用。 【参考方案1】:

为了多样性,除非你想要重复的键,否则为什么不只使用 HashMap。 键是名称,值是数字的 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);

【讨论】:

这可能是一个很好的建议(我以前从未使用过 HashMaps),但这不是我问题的答案。如果可以的话,用一种对 HashMap 进行排序的方法来补充这个答案。 绝对是哥们,如果你的目的是自然顺序,你可以使用 TreeMap 而不是 HashMap 他们都实现了 Map 接口【参考方案2】:

您可以使用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]]

【讨论】:

我还没有见过这么简单的其他答案。很高兴我问了这个问题。 @mikeaworski 不客气 =)【参考方案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);

【讨论】:

此解决方案也有效。这也值得 +1。

以上是关于如何仅按第一个元素对 2D ArrayList<String> 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

仅按第二行对 np 二维数组进行排序[重复]

如何通过android中的数值列对listview项进行排序

如何在2d Java ArrayList中获取元素?

如何在 java 中创建一个 2D ArrayList? [复制]

对 2D ArrayList 进行冒泡排序

如何在android中按数值列对listview项目进行排序