【问题标题】:How to sort the first elements of List of Lists in alphabetical order?如何按字母顺序对列表列表的第一个元素进行排序?
【发布时间】:2015-04-02 16:22:22
【问题描述】:

首先,我希望程序做的是按每个列表的第一个元素按字母顺序对列表进行排序。 然后将它们排序回原来的顺序。 代码如下。

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]]

【问题讨论】:

  • 创建封闭列表的副本,并对该副本进行排序。您将按原始顺序获得原始列表,副本按第一个元素排序。您不能“撤消”排序:排序是不可逆的。

标签: java list sorting


【解决方案1】:

您可以使用自定义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

【讨论】:

  • 注意 lambda 是在 java 8 中引入的,所以这些 sn-ps 不会在低于 8 的版本中编译
  • 是的。我在答案中添加了一条注释,因此警告了 OP。谢谢。
  • ArrayList> 类型的方法 sort(( List1, List2) -> {}) 未定义我在行中收到此错误: 'listToSort.sort((List1, List2)->List1.get(0).compareTo(List2.get(0)));'
  • @TimDaiber 看起来您使用的是较旧的 Java 版本。 List.sort() 适用于 Java 8。如果可以,您应该更新到 Java 8。如果你不能,copeg 的答案应该可以正常工作。
  • @Anderson Vieira 我已经更新到 1.8 但我仍然遇到同样的错误。
【解决方案2】:

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

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

    });

你不能颠倒这种排序的顺序,除非有一个特定的算法可以使用你可以对元素的原始顺序进行排序。话虽如此,要保持原始顺序,只需创建列表的副本并对原始(或复制的)进行排序,这将为您留下列表的排序和未排序副本。

【讨论】:

  • 抱歉这个可能很愚蠢的问题。上面的代码是在单独的方法或类中吗?我只是不确定如何将代码实现到我的中。
  • 在方法中使用 this - 这会对列表进行内联排序。 Collections 的 sort 方法是静态方法,Comparator 是匿名类。将您的 List 和 Comparator 传递给 Collections.sort 后,将对 List 进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2013-05-02
相关资源
最近更新 更多