按 Java 中的内部列表索引对列表列表进行排序? (Java 相当于 Python 的 'sorted()')

Sorting List of List by inner list's index in Java? (Java Equivalent of Python's 'sorted()')

在 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 and here: ) 但我正在 Java.

中寻找解决方案

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

发帖后 2 分钟就解决了我自己的问题。当发生这种情况时,一定要爱 lol:

    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 也指出可以在此处使用自定义比较器。可能比迭代方式更漂亮

试试这个。

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

两种情况都是稳定排序

因为Java 8 有方法List::sort accepting a custom Comparator which can be built using Comparator.comparing

所以,lists的输入列表可以简明排序如下:

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