2015-02-04 112 views
0

我一直在這個谷歌搜索,我發現this answer。番石榴中有一種Iterables.concat。但是這返回Iterable,我想要做的下一件事是排序結果。 Collections.sort需要List,而不是Iterable,因此我必須將Iterable轉換爲List作爲下一步。有沒有更直接的方法來結合兩個List s然後對結果進行排序?如何連接兩個列表來創建第三個?

+3

'Lists.newArrayList(Iterables.concat(...))'工作? –

+0

@RC。我會接受,作爲回答 –

+1

添加爲答案(不知道我明白了這個問題,所以我評論) –

回答

4
List<Something> list = Lists.newArrayList(Iterables.concat(...)); 
Collections.sort(list); 

可能是這裏的解決方案。

+3

更快,可能更快:'Ordering.natural()。sortedCopy(Iterables.concat(...))' –

+0

@LouisWasserman這是一個聰明的解決方案,謝謝 –

3

列表中有addAll(Collection)方法,我認爲這對您的目的很有用。您可以複製第一個列表,做出這樣的事情:

copyList1.addAll(list2); 
1

您可以使用

List<Something> list1; 
List<Something> list2; 

list1.addAll(list2); 
Collections.sort(list1); 

(假設你的列表是Comparable的List)

如果你不想修改list1,你可以使用:

List<Something> list3 = new ArrayList<>(); 
Collections.copy(list3, list1); 
list3.addAll(list2); 
Collections.sort(list3); 
2

如果一個SortedSet也是好的作爲返回類型(我覺得這是一個你真的想在大多數情況下),你可以這樣做:

FluentIterable.from(list1).concat(list2).toSortedSet(Ordering.natural()); 
+3

僅供參考,還有'toSortedList(Ordering.natural() )'。 – ColinD

1

在Java 8(替換字符串與任何類型的列表中包含):

List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).collect(Collectors.<String>toList()); 

這將連接你的兩個列表來創建一個新的第三個列表。然後,您可以對它進行排序爲您在您的文章使用Collections.sort提到:

Collections.sort(newList); 

參見:How do I join two lists in Java?

6

在Java 8:

List<E> sorted = Stream.concat(l1.stream(), l2.stream()) 
         .sorted() 
         .collect(Collectors.toList()); 
1

下應該用JAVA 8個流API

class T { 
    @Getter private int sortingProperty; 
    } 
List<T> list3 Stream.of(list1OfT,list2OfT)  
           .sorted(Comparing(T::getSortingProperty)) 
           .collect(toList()); 
相關問題