2015-02-04 115 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()); 
相关问题