如何按字母顺序对列表中嵌套的列表的首个元素进行排序?

5
首先,我希望程序按照每个列表的第一个元素的字母顺序对列表进行排序。 然后将它们按原始顺序排序。 代码如下。
ArrayList<ArrayList<String>> mylist = new ArrayList<ArrayList<String>>();
    List<String> List1 = new ArrayList<String>();
    List<String> List2 = new ArrayList<String>();
    List<String> List3 = new ArrayList<String>();
    List1.add("A");
    List2.add("B");
    List3.add("A");
    List1.add("C");
    List2.add("D");
    List3.add("E"); 
    mylist.add((ArrayList<String>) List1);
    mylist.add((ArrayList<String>) List2);
    mylist.add((ArrayList<String>) List3);
    System.out.println(mylist.toString());

目前的打印结果是:

[[A, C], [B, D], [A, E]]

我希望将它们排序,使结果为:

[[A, C], [A, E], [B, D]]

然后再将它们按原始形式排序:

[[A, C], [B, D], [A, E]]


1
创建一个封闭列表的副本,并对该副本进行排序。您将拥有原始顺序的原始列表和按第一个元素排序的副本。您无法“撤消”排序:排序不可逆。 - JB Nizet
2个回答

11

您可以使用自定义的Comparator来对列表进行排序。如果您正在使用Java 8,可以按照以下方式完成:

mylist.sort((l1, l2) -> l1.get(0).compareTo(l2.get(0)));

请注意,这会修改原始列表,并且无法撤消排序。因此,您应该创建一个副本并对副本进行排序。

例如:

请注意,这会修改原始列表,并且无法撤消排序。因此,您应该创建一个副本并对副本进行排序。

例如:

List<List<String>> listToSort = new ArrayList<>(mylist);
listToSort.sort((l1, l2) -> l1.get(0).compareTo(l2.get(0)));
System.out.println(listToSort);

输出:

[[A, C], [A, E], [B, D]]

注意:

如果您使用的是Java 7及以下版本,则应使用Collections.sort()方法并创建显式Comparator


是的。我已经在答案中添加了一条注释,以便警告原帖作者。谢谢。 - Anderson Vieira
在类型 ArrayList<ArrayList<String>> 中,方法 sort((<no type> List1, <no type> List2) -> {}) 未定义。我在以下代码行中遇到这个错误:'listToSort.sort((List1, List2)->List1.get(0).compareTo(List2.get(0)));' - Tim Daiber
1
@TimDaiber 看起来你正在使用较旧的Java版本。List.sort()适用于Java 8。如果可以的话,你应该升级到Java 8。如果不能,copeg的答案应该可以正常工作。 - Anderson Vieira
@Anderson Vieira,我已经更新到1.8,但仍然收到相同的错误。 - Tim Daiber
@TimDaiber 你在使用Eclipse吗?如果是的话,你应该使用支持Java 8的版本,比如Luna这个视频展示了如何进行配置。 - Anderson Vieira
显示剩余6条评论

0

按照每个列表的第一项的字母顺序排序,实现自定义比较器:

    Collections.sort(mylist, new Comparator<ArrayList<String>>(){

        @Override
        public int compare(ArrayList<String> arg0, ArrayList<String> arg1) {
            return arg0.get(0).compareTo(arg1.get(0));
        }

    });

如果没有特定的算法可以对元素的原始顺序进行排序,那么您不能反转此排序的顺序。话虽如此,要保持原始顺序,只需创建列表的副本并对原始(或复制)进行排序,这将使您拥有已排序和未排序的列表副本。


抱歉可能是个愚蠢的问题。上面的代码是在一个单独的方法或类中吗?我不太确定如何将代码实现到我的项目中。 - Tim Daiber
在方法内使用此代码-它会对列表进行原地排序。Collections的sort方法是一个静态方法,而Comparator是一个匿名类。将您的List和Comparator传递给Collections.sort后,该List将被排序。 - copeg

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