2

我试图将几个列表合并为一个,消除重复项。Guava 中的 mergeSorted 方法似乎适用于我的情况。但是当我尝试它时,我看到关于我传递给该方法的参数的编译错误。我的代码就这么简单,我有两个列表,将它们合并为一个,然后尝试对其进行合并排序,但是在第四行出现编译错误。

    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<? 扩展可迭代<? extends T>> iterables 但方法描述似乎表明输入可以是所有给定迭代的合并内容

@Beta public static <T> Iterable<T> mergeSorted(Iterable<? extends Iterable<? extends T>> iterables, Comparator<? super T> 比较器)

返回所有给定迭代的合并内容的迭代。不会对等效条目进行重复数据删除。

调用者必须确保源迭代是非降序的,因为此方法不会对其输入进行排序。

4

1 回答 1

10

您目前正在合并之前将您的可迭代对象连接在一起- 此时,结果不再排序,除了其他任何东西!

正如您所指出的,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));
    }
}   
于 2013-08-21T06:14:48.287 回答