簡體   English   中英

按每個子列表中的第一個數字對列表<List <Integer >>進行排序

[英]Sort List<List<Integer>> by first number in each sub-list

我遇到了以下問題。 我有一個ArrayList(1)的ArrayList(1)。 我需要做的是,對結構進行排序,使ArrayLists(2)的第一個元素按升序順序向下傳播ArrayList(1)。 澄清:

輸入:

3, 8, 6
2, 14, 205, 44, 1
1, 3

輸出:

1, 3
2, 14, 205, 44, 1
3, 8, 6

看看它如何僅根據第一個值對行進行排序。

現在,為我定義arraylists的arraylist的方式是:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// and I add elements to it likewise
graph.get(currentIndex).add(new ArrayList<Integer>());

我使用ArrayList的原因是因為我讀到它比LinkedList更有內存效率,因為我正在構建一個圖的鄰接列表列表。 在其中,節點的數量可以變化,或者每個節點的鄰接列表的長度。 行的第一個元素是start_node ,以下是 - 它的相鄰元素。 你能告訴我怎樣才能實現這種排序?

據我了解,您希望按每個嵌套列表的第一個元素對頂級列表進行排序。 它是否正確? 以下是我將如何做到這一點:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// add a bunch of things ...
// ...

// Now, to sort:
graph.sort((x,y) -> Integer.compare(x.get(0), y.get(0)));

這是使用Integer來獲取Comparator ,這是sort()方法按一些自定義條件排序所需的。 在這種情況下,我們告訴它的排序ListLists graph ,通過比較任意兩個項目graph得到他們的第一個項目,對它們進行比較,你通常比較Integer秒。

請注意,這假設graph 的所有項目都有第一項。

要比較2個子列表,您需要找到第一個不相等的對,並比較它們的值(如果兩者都以32開頭,則需要查看下一個值才能看到)

List<List<Integer>> graph = new ArrayList<>();
graph.add(Arrays.asList(3, 8, 6));
graph.add(Arrays.asList(2, 14, 205, 44, 1));
graph.add(Arrays.asList(2, 14, 205, 44, 2));
graph.add(Arrays.asList(1, 3));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4, 5));

graph.sort((o1, o2) -> {
    int indice, cmp, min;
    for (indice = 0, min = Math.min(o1.size(), o2.size());
         indice < min; indice++) {
        if ((cmp = Integer.compare(o1.get(indice), o2.get(indice))) != 0) {
            return cmp;
        }
    }
    if (indice == o1.size()) return -1;
    if (indice == o2.size()) return 1;
    return 0;
});

System.out.println(graph);

[[1, 3], 
 [1, 4], 
 [1, 4], 
 [1, 4, 5], 
 [2, 14, 205, 44, 1], 
 [2, 14, 205, 44, 2], 
 [3, 8, 6]]

另一方面,使用Comparator接口的另一種方式(我同意這不是很好),它比較值,直到其中一個列表為空,然后它將比較大小,如果它達到一個完全

graph.sort((o1, o2) -> {
    Comparator<List<Integer>> cc = Comparator.comparingInt(l -> l.get(0));
    int indice, min;
    for (indice = 0, min = Math.min(o1.size(), o2.size()); indice < min; indice++) {
        final int i = indice;
        cc = cc.thenComparingInt(l -> l.get(i));
    }
    return cc.thenComparingInt(List::size).compare(o1, o2);
});

所以,這是我提出的另一種解決方案。

這個想法是:使用Collections的靜態方法sort()並使用對列表的引用和由我們compare()定義的新Comparator對象來提供它。

Collections.sort(graph, new Comparator<List<Integer>>(){
@Override
public int compare(List<Integer> aList1, List<Integer> aList2) {
   return aList1.get(0).compareTo(aList2.get(0));
}
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM