【问题标题】:Sorting List of List by inner list's index in Java? (Java Equivalent of Python's 'sorted()')在Java中按内部列表的索引对列表进行排序? (Java 等效于 Python 的 'sorted()')
【发布时间】:2021-03-21 07:35:48
【问题描述】:

在 Java 中,我有一个类似于以下内容的列表:

[ ["Kelly", "3.0"], ["Jeff", "2.0"], ["Mark", "1.0]" ]

如何按某个索引对列表进行排序?在这种情况下,索引为 1

例如)

Given:   [ ["Kelly", "3.0"], ["Jeff", "2.0"], ["Mark", "1.0"] ]
Desired: [ ["Mark", "1.0"], ["Jeff", "2.0"], ["Kelly", "3.0"] ]

我正在寻找的是与 Python 中的“sorted()”方法非常相似的东西(我在 Python 中寻找的确切解决方案如下所示:https://www.kite.com/python/answers/how-to-sort-a-list-of-lists-by-an-index-of-each-inner-list-in-python 和这里:sort list of lists by specific index of inner list)但我'我正在寻找 Java 中的解决方案。

另外,作为奖励,我将如何按降序对这些进行排序?相同值的实例怎么样(即有多个 '3.0' 值)

【问题讨论】:

  • 您可以使用自定义比较器来比较每个列表的第二个元素以确定排序顺序。这只是一个翻转变量以实现降序的问题。

标签: java sorting compare


【解决方案1】:

从 Java 8 开始,有一个方法 List::sort 接受自定义的 Comparator,可以使用 Comparator.comparing 构建。

因此,列表的输入列表可以简洁地排序如下:

List<List<String>> data = Arrays.asList(
    Arrays.asList("Kelly", "3.0"),
    Arrays.asList("Mark", "1.0"),
    Arrays.asList("Jeff", "2.0")
);

// sorting by index 1
data.sort(Comparator.comparing(x -> x.get(1))); 
// [[Mark, 1.0], [Jeff, 2.0], [Kelly, 3.0]]

// sorting by index 1 in reverse order using Collections.reverseOrder
data.sort(Comparator.comparing(x -> x.get(1), Collections.reverseOrder()));
// [[Kelly, 3.0], [Jeff, 2.0], [Mark, 1.0]]

// sorting by index 0 in reverse order using Comparator.reversed()
// here type of object being compared needs to be specified
data.sort(Comparator.comparing((List<String> x) -> x.get(0)).reversed());
// [[Mark, 1.0], [Kelly, 3.0], [Jeff, 2.0]]

【讨论】:

    【解决方案2】:

    试试这个。

    List<List<String>> list = Arrays.asList(
        Arrays.asList("Jhon", "3.0"), Arrays.asList("Kelly", "3.0"),
        Arrays.asList("Jeff", "2.0"), Arrays.asList("Mark", "1.0"));
    //  sort the list by index of 1
    list.sort(Comparator.comparing(x -> x.get(1)));
    System.out.println(list);
    //  sort the list by index of 1 descending order
    list.sort(Collections.reverseOrder(Comparator.comparing(x -> x.get(1))));
    System.out.println(list);
    

    输出:

    [[Mark, 1.0], [Jeff, 2.0], [Jhon, 3.0], [Kelly, 3.0]]
    [[Jhon, 3.0], [Kelly, 3.0], [Jeff, 2.0], [Mark, 1.0]]
    

    在这两种情况下都是稳定排序。

    【讨论】:

      【解决方案3】:

      在发布后 2 分钟解决了我自己的问题。发生这种情况时总是要爱,哈哈:

          for (int i=0; i < listToReverse.size(); i++) {
              for (int j=0; j < (listToReverse.size()-i-1); j++) {
                  if ((int)Double.parseDouble(listToReverse.get(j).get(1)) < (int)Double.parseDouble(listToReverse.get(j+1).get(1))) {
                      ArrayList<String> temp = listToReverse.get(j);
                      listToReverse.set(j, asList.get(j+1));
                      listToReverse.set(j+1, temp);
                  }
              }
          }
      //This implementation sorts in descending order. Switch the '<' for a '>' to sort in ascending order
      

      感谢@bliss 指出可以在此处使用自定义比较器。可能比迭代方式更漂亮

      【讨论】:

      • 应用自定义比较器就像listToReverse.sort((list1, list2) -&gt; list1.get(1).compareTo(list2.get(1))); 一样简单,它使用了更高效的库排序算法。
      猜你喜欢
      • 2016-09-10
      • 2011-05-09
      • 2018-01-30
      • 2021-10-07
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多