2013-08-21 23 views
2

我試圖將幾個列表合併爲一個,消除了重複。 Guava中的mergeSorted方法似乎適用於我的情況。但是當我嘗試使用它時,我發現有關我傳遞給該方法的參數的編譯錯誤。我的代碼就像這樣簡單,我有兩個列表,將它們連接成一個,然後嘗試mergeSort它,但是我得到了第四行的編譯錯誤。Guava mergeSorted issue

final List<Integer> first = Lists.newArrayList(1, 2, 3); 
    final List<Integer> second = Lists.newArrayList(4, 2, 5, 6); 
    Iterable<Integer> some = Iterables.concat(first, second); 
    final Iterable all = Iterables.<Integer>mergeSorted(some, comp); 
    System.out.println(all); 

它看起來就像是mergeSorted期待可迭代<?擴展了Iterable <?擴展T >> iterables但該方法的描述似乎表明,輸入可以是所有給定iterables

的合併的內容

@Beta公共靜態< T>可迭代< T> mergeSorted(可迭代<?延伸 可迭代<?擴展T >> iterables, 比較器<?super T>比較器)

返回所有給定迭代的合併內容的迭代。 等效條目不會被重複刪除。

由於此方法不對其輸入進行排序,因此調用者必須確保源迭代器的順序爲非下降 。

回答

9

你目前的串聯在一起iterables以前合併 - 在這一點上,其結果是沒有排序更多,二話不說!

正如你所指出的,mergeSorted需要一個「可迭代迭代」。全部樣本:

import java.util.List; 
import com.google.common.base.Joiner; 
import com.google.common.collect.Iterables; 
import com.google.common.collect.ImmutableList; 
import com.google.common.collect.Lists; 
import com.google.common.collect.Ordering; 

public class Test { 
    public static void main(String[] args) { 

     List<Integer> first = Lists.newArrayList(1, 2, 3); 
     // Note that each input list has to be sorted already! 
     List<Integer> second = Lists.newArrayList(2, 4, 5, 6); 
     Iterable<Integer> all = Iterables.mergeSorted(
      ImmutableList.of(first, second), Ordering.natural()); 
     System.out.println(Joiner.on(", ").join(all)); 
    } 
} 
+0

您能否添加顯示如何對列表進行排序的代碼(如果它們尚未排序)? – artfullyContrived

+0

@artfullyContrived:只需使用'Collections.sort'。 –

+0

欣賞幫助。你會碰巧知道mergeSorted方法的複雜性嗎?它實際上是否在其實現中使用合併排序 –