当前位置: 首页 > 面试题库 >

流和独特的操作

缪风史
2023-03-14
问题内容

我有以下代码:

class C
{
    String n;

    C(String n)
    {
        this.n = n;
    }

    public String getN() { return n; }

    @Override
    public boolean equals(Object obj)
    {
        return this.getN().equals(((C)obj).getN());
    }
 }

List<C> cc = Arrays.asList(new C("ONE"), new C("TWO"), new C("ONE"));

System.out.println(cc.parallelStream().distinct().count());

但我不明白为什么会distinct返回3而不是2。


问题答案:

您还需要重写hashCodeclass中的方法C。例如:

@Override
public int hashCode() {
    return n.hashCode();
}

当两个C对象相等时,它们的hashCode方法必须返回相同的值。

接口的API文档Stream没有提及这一点,但是众所周知,如果您覆盖equals,则还应该覆盖hashCode。API文档Object.equals()提到了这一点:

请注意,通常有必要在重写此hashCode方法时重写该方法,以维护该hashCode方法的常规协定,该协定规定相等的对象必须具有相等的哈希码。

显然,Stream.distinct()确实使用了对象的哈希码,因为当您像上面显示的那样实现它时,您会得到预期的结果:2。



 类似资料:
  • 哪些流操作使用、和拆分器特性?它们在这些操作中如何发挥作用? 我不是问这些标志是什么,这在文档中很容易找到。我在问哪些操作使用它们以及如何使用它们。

  • 问题内容: http://golang.org/ref/spec#Import_declarations “ import”语法是专门用于导入软件包的吗?看起来像一个使用“;”的函数调用 而不是“,”进行参数化。似乎它甚至可能是红宝石风格的方法调用(即:sans“()”) PS 以为我想请他们对此有所了解。我真的很喜欢Go的工作,但是它的某些语法似乎有些不一致,有时有些冗长。我不知道要为它创建一个

  • 问题内容: 我刚刚发现了新的Java8流功能。来自Python,我想知道现在是否有一种巧妙的方法可以对数组进行操作,例如求和,以“单行pythonic”的方式将两个数组相乘? 谢谢 问题答案: 添加了新的方法来将数组转换为Java 8流,然后将其用于求和等。 将两个数组相乘会有点困难,因为我想不出一种与Stream操作同时获取值和索引的方法。这意味着您可能必须流式处理数组的索引。 编辑 批评家@H

  • 在traits内部定义的方法可以访问同一对象中定义的方法一样的公共属性范围,这是很有用的。然而,有没有任何方法可以使两个特征使用相同的属性名称,但每个属性都在不同的范围内,因此不会覆盖

  • 问题内容: 我有一个重复的行的DataFrame。我想获得一个具有唯一索引且没有重复项的DataFrame。可以丢弃重复的值。这可能吗?做完了吗? 问题答案: In [29]: df.drop_duplicates() Out[29]: b c 1 2 3 3 4 0 7 5 9

  • 问题内容: tl; dr Python是否会重用ID?生命周期不重叠的两个对象获得相同ID的可能性有多大? 背景: 我一直在从事一个纯粹用Python 3编写的复杂项目。我一直在测试中看到一些问题,并花了大量时间寻找根本原因。经过一些分析,我怀疑当测试整体运行时(由专门的调度员精心策划并运行),它正在重用某些模拟方法,而不是用其原始方法实例化新对象。为了检查解释器是否正在重用,我使用。 问题: 通