[英]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()
方法按一些自定義條件排序所需的。 在這種情況下,我們告訴它的排序List
中Lists
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.