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

7
为避免重复声明,我查看了帖子,但并不完全符合我的要求。
其他所有的2D ArrayList问题都涉及doubleint数字;而我的问题是关于Strings的。

我的操作

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

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

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

示例

假设我已经填充了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中使用Collections呢?我认为这将是您的情况的完美工具,不是吗? - VJ Vélan Solutions
@harikris 这是一个嵌套的ArrayList。是的,我认为Collections可以工作,但我不知道该怎么做。 - Michael Yaworski
1
如果您使用了集合(Collections),那么排序将变得轻而易举。此外,如果您使用了集(Sets)而不是列表(Lists),那么您也可以自动避免重复条目。学习集合和泛型并不难。我可以建议一本参考书吗?不确定这是否会被视为推广。我没有写过这本书。只是认为它是一个很好的资源。作者是Kathy Sierra和Bert Bates。他们在他们的《Head First Java》书中有一个关于集合/泛型的章节。希望对你有所帮助。 - VJ Vélan Solutions
你应该阅读并遵循那个问题中被接受的答案,即使它不是完全相同的重复问题,它仍然适用于你的问题! - Robin Green
@RobinGreen 我会尝试跟着做,但我也想在不创建另一个类的情况下得到这个问题的答案。 - Michael Yaworski
显示剩余2条评论
3个回答

18

您可以使用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
我没有看到其他答案如此简单。我很高兴问了这个问题。 - Michael Yaworski
@mikeyaworski 不用客气 =) - user2336315

5
创建一个自定义比较器:
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);

这个解决方案也可行。这也值得点赞。 - Michael Yaworski

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);

这可能是一个不错的建议(我以前从未使用过HashMap),但这并不是我的问题的答案。如果可以的话,请补充一种对HashMap进行排序的方法。 - Michael Yaworski
如果你的目的是自然排序,那么你可以使用TreeMap而不是HashMap,它们都实现了Map接口。 - Yehia Awad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接