如何从两个不同对象列表中获取不常见对象

胡安

我有两个清单

List<Foo> foolist = getAll();
List<Bar> barList = getAll();

class Foo {
    String name;
    String age;
    ....
    // more fields
}

class Bar {
    String barName;
    int codeBar;
    ....
    // more field
}

我们可以用 age<->codeBar 和 name<->barName 来建立它们之间的关系我想得到不傻的 Bar 对象,如何使用流来完成?

我看到使用 stream().filter(list::contains) 的示例,但在这种情况下无效。

谁能指出我正确的方向?

谢谢大家。我看起来像这样:barList.stream().filter(b->fooList.stream().anyMatch(f->!b.getBarName().equalsIgnoreCase(f.getName) && b.getCodeBar() == Integer.valueOf(age))).collect(Collectors.toList());

还不知道对不对

雅罗斯瓦夫·帕拉克

你可以这样做:

public static void main(String[] args) {
    List<Foo> fooList = asList(new Foo("1", "1"), new Foo("2", "2"), new Foo("3", "3"));
    List<Bar> barList = asList(new Bar("4", 4), new Bar("3", 3), new Bar("5", 5));

    Set<Blah> fooSet = fooList.stream().map(Main::fooToBlah).collect(toCollection(HashSet::new));
    Set<Blah> barSet = barList.stream().map(Main::barToBlah).collect(toCollection(HashSet::new));

    barList.stream()
            .filter(bar -> !fooSet.contains(barToBlah(bar)))
            .forEach(System.out::println);
    fooList.stream()
            .filter(foo -> !barSet.contains(fooToBlah(foo)))
            .forEach(System.out::println);
}

static Blah fooToBlah(Foo foo) {
    return new Blah(foo.name, foo.age);
}

static Blah barToBlah(Bar bar) {
    return new Blah(bar.barName, "" + bar.codeBar);
}

static class Blah {
    String name;
    String age;

    public Blah(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }
}
  1. 获取所有Foo对象并将它们转换为Blah(当然适当命名) - 这是必需的,因为Foo还有我们不关心的其他字段。
  2. Blah对象放入 a 中,HashSet这样您就不会以O(n*m)时间复杂度告终你可以只做collect(toSet()),但我更愿意在这里明确说明它,因为它对性能很重要。
  3. 检查Bar对象,如果一个对象不在上面的集合中,那就是不常见的Bar对象。它需要转换为Blah,不幸的是您不能使用,Stream.map因为最终它应该仍然是Stream<Bar>,而不是Stream<Blah>
  4. 对另一个列表重复上述三个步骤以查找所有不常见的Foo对象。

请记住,课堂上需要equalshashCode方法BlahFooBar类不需要他们。


编辑:

您可以转换以下代码

Set<Blah> fooSet = fooList.stream().map(Main::fooToBlah).collect(toCollection(HashSet::new));

barList.stream()
        .filter(bar -> !fooSet.contains(barToBlah(bar)))
        .forEach(System.out::println);

变成这样

barList.stream()
        .filter(bar -> fooList.stream()
                .map(Main::fooToBlah)
                .noneMatch(foo -> foo.equals(barToBlah(bar)))
        )
        .forEach(System.out::println);

甚至Blah完全删除

barList.stream()
        .filter(bar -> fooList.stream().noneMatch(foo -> Objects.equals(foo.name, bar.barName) && Objects.equals(foo.age, "" + bar.codeBar)
        .forEach(System.out::println);

但是你最终会得到更糟糕的时间复杂度,然后还有一个可读性问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中,如何检查不同对象的两个数组列表中缺少的元素?

如何在Ruby中的两个单独的字符串之间返回不常见的字符?

如何导出两个数据帧之间不常见的记录列表?

如何合并两个不同对象的列表?

R中两个不同对象签名的setMethod

如何在Swift中获取2个数组的不同(不常见)项目的列表

两个不同对象的总和

从两个列表中获取不常见的元素-KOTLIN

Laravel Mailables的工作,常见对象

如何在SQL的两个表中获取具有不常见值的行?

如何获得两个两个元素数据集之间的不同对象?

如何仅使用OSX中的终端命令从两个文件中查找不常见的单词?

从列表中的两个不同对象返回LINQ select查询中的特定对象

xmlSerialize不同对象的两个列表

如何从两个文件中提取不常见的不区分大小写的文本?

GSON 反序列化同一列表中的两个不同对象类型

如何合并两个不同对象的列表?

C#采用两个不同对象的列表来构造新的对象列表

如何在两个不同的数据列之间提取不常见的数据?

如何计算R中字符的常见对象

如何将具有唯一字段的两个不同对象列表合并到一个单独的列表中?

按名称比较两个对象列表并获取不同对象的列表

如何从 R 中的两个 df 获取常见(反之亦然)和不常见的行

如何过滤数组以获取laravel中两个不同对象中的特定列

按某些两个字段比较不同对象的两个列表

如何以交替顺序排列两个不同对象列表的 XMLArray 项目?

如何仅过滤 Javascript 中的常见对象值

组合两个不同对象类型的列表并对组合列表进行排序

基于java 8中的匹配属性比较两个不同对象类型的列表