【问题标题】:Guava mergeSorted issue番石榴合并排序问题
【发布时间】:2013-08-23 09:08:18
【问题描述】:

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

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

@Beta public static Iterable mergeSorted(Iterable extends 可迭代> 可迭代对象, 比较器比较器)

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

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

【问题讨论】:

    标签: java guava mergesort iterable


    【解决方案1】:

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

    正如您所指出的,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));
        }
    }   
    

    【讨论】:

    • 您能否添加代码显示如何对列表进行排序以防它们尚未排序?
    • @artfullyContrived:使用Collections.sort
    • 感谢您的帮助。你会碰巧知道方法mergeSorted 的复杂性吗?它在实现中是否真的使用了归并排序
    • @KarthikBalasubramanian: 不 - 关键是它正在合并已经排序的迭代器,所以当它被要求提供下一个值时,它只需要找到哪个迭代器具有 lowest 值作为其“当前”值。我不想随便推测复杂性,但我怀疑它是 O(N) - 检查实现以获取详细信息。
    • IIRC,它使用一个 PriorityQueue,所以每个 next() 调用的 O(log n)。
    猜你喜欢
    • 2012-04-13
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多