【问题标题】:How to Sort 2D ArrayList<String> by Only the First Element [duplicate]如何仅按第一个元素对 2D ArrayList<String> 进行排序
【发布时间】: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 您可以提出建议,但我可能不会阅读它来回答这个问题。我目前没有时间立即阅读。不过可能会晚一点。谢谢。
  • 没问题。那一章有一个工作示例。只是让你知道。供以后使用。

标签: java sorting arraylist


【解决方案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。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2016-08-28
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多