首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区别新的LinkedList<>(新的LinkedList<>())和新的LinkedList...,添加

区别新的LinkedList<>(新的LinkedList<>())和新的LinkedList...,添加
EN

Stack Overflow用户
提问于 2019-07-14 22:23:11
回答 3查看 110关注 0票数 2

更新:感谢你所有的答案。我找到的最干净的解决方案是这个:

代码语言:javascript
复制
if ( k<=0 ) return new LinkedList<>(Arrays.asList(new LinkedList<>()));

我有一个递归方法,可以从一个列表中生成所有的'n选择k‘组合。在实现中,我发现创建新LinkedList实例的两种方法之间有一个奇怪的区别。

代码语言:javascript
复制
public static <T> List<List<T>> extract2(int k, List<T> list) {
    if ( k<=0 ) {
        // this way fails the test
        return new LinkedList<>(new LinkedList<>());
        // and this way works fine.
        //var v = new LinkedList<List<T>>();
        //v.add(new LinkedList<>());
        //return v;
    }

    if ( list.isEmpty())
        return new LinkedList<>();

    T h = list.get(0);
    List<T> tl = new LinkedList<>(list.subList(1, list.size()));

    List<List<T>> with_h = extract2(k - 1, tl).stream()
            .peek(l -> l.add(0, h)).collect(Collectors.toList());
    List<List<T>> without_h = extract2(k, tl);
    with_h.addAll(without_h);
    return with_h;
}

对于LinkedList的注释掉的初始化,代码工作得很好,但是对于new LinkedList(new LinkedList()),它失败了。

我是不是遇到了某种编译器优化?

这是一个小的Junit5测试

代码语言:javascript
复制
        var res = App.extract2(2, Arrays.asList("a", "b", "c", "d"));
        assertThat(res, is(Arrays.asList(
                Arrays.asList("a", "b"),
                Arrays.asList("a", "c"),
                Arrays.asList("a", "d"),
                Arrays.asList("b", "c"),
                Arrays.asList("b", "d"),
                Arrays.asList("c", "d")

        )));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-14 22:32:26

代码语言:javascript
复制
new LinkedList<>(new LinkedList<>())

创建一个新的LinkedList,并将列表中作为项传递给构造函数的所有项添加到其中。传递的列表是空的,所以你返回的列表也是空的。

代码语言:javascript
复制
var v = new LinkedList<List<T>>();
v.add(new LinkedList<>());

创建一个空列表,然后将一个空列表作为项添加到其中。因此,第一个列表现在有一个条目。

不同之处在于,在第一个示例中,您只创建了一个空列表,而在第二个示例中,您创建了一个包含(空)列表项目的列表。这会导致算法的不同。

票数 1
EN

Stack Overflow用户

发布于 2019-07-14 22:28:37

这里

代码语言:javascript
复制
new LinkedList<>(new LinkedList<>());

您正在使用一个LinkedList构造函数,该构造函数从参数集合中获取元素并将它们添加到此LinkedList中。这与使用add()方法创建LinkedList并向其添加新的LinkedList as元素完全不同。

票数 2
EN

Stack Overflow用户

发布于 2019-07-14 22:55:21

感谢所有人,特别是“模拟器”给出了清晰的答案!JShell应该把我叫醒的:

代码语言:javascript
复制
jshell> new LinkedList(new LinkedList());
$5 ==> []
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57028234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档