- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
让我们有一个类Person
。人有名字和高度。
Equals 和 hashCode() 只考虑名称。 Person 是可比较的(或者我们为它实现了比较器,不管是哪一个)。人员按高度进行比较。
期望两个不同的人可以具有相同的高度似乎是合理的,但是例如TreeSet 的行为类似于 compareTo()==0 表示相等,而不仅仅是大小相同。
为避免这种情况,如果大小相同,比较可以第二次查看其他内容,但不能用于检测相同大小的不同对象。
例子:
import java.util.Comparator;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
public class Person implements Comparable<Person> {
private final String name;
private int height;
public Person(String name,
int height) {
this.name = name;
this.height = height;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getName() {
return name;
}
@Override
public int compareTo(Person o) {
return Integer.compare(height, o.height);
}
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if (!Objects.equals(this.name, other.name)) {
return false;
}
return true;
}
public int hashCode() {
int hash = 5;
hash = 13 * hash + Objects.hashCode(this.name);
return hash;
}
public String toString() {
return "Person{" + name + ", height = " + height + '}';
}
public static class PComparator1 implements Comparator<Person> {
@Override
public int compare(Person o1,
Person o2) {
return o1.compareTo(o2);
}
}
public static class PComparator2 implements Comparator<Person> {
@Override
public int compare(Person o1,
Person o2) {
int r = Integer.compare(o1.height, o2.height);
return r == 0 ? o1.name.compareTo(o2.name) : r;
}
}
public static void test(Set<Person> ps) {
ps.add(new Person("Ann", 150));
ps.add(new Person("Jane", 150));
ps.add(new Person("John", 180));
System.out.println(ps.getClass().getName());
for (Person p : ps) {
System.out.println(" " + p);
}
}
public static void main(String[] args) {
test(new HashSet<Person>());
test(new TreeSet<Person>());
test(new TreeSet<>(new PComparator1()));
test(new TreeSet<>(new PComparator2()));
}
}
结果:
java.util.HashSet
Person{Ann, height = 150}
Person{John, height = 180}
Person{Jane, height = 150}
java.util.TreeSet
Person{Ann, height = 150}
Person{John, height = 180}
java.util.TreeSet
Person{Ann, height = 150}
Person{John, height = 180}
java.util.TreeSet
Person{Ann, height = 150}
Person{Jane, height = 150}
Person{John, height = 180}
你知道为什么会这样吗?
最佳答案
从 java.util.SortedSet
中提取 javadoc:
Note that the ordering maintained by a sorted set (whether or not an explicit comparator is provided) must be consistent with equals if the sorted set is to correctly implement the Set interface. (See the Comparable interface or Comparator interface for a precise definition of consistent with equals.) This is so because the Set interface is defined in terms of the equals operation, but a sorted set performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the sorted set, equal. The behavior of a sorted set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface.
因此,换句话说,SortedSet
打破(或“扩展”)Object.equals()
和 Comparable.compareTo
的一般契约(Contract)>。查看compareTo
的合约:
It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."
关于java - 如果 compareTo() 返回 0,为什么暗示对象相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7229977/
也许我在 Java 上工作的时间太长而没有真正理解它的一些基础知识。 我确实理解 == 用于对象引用相等,而 .equals() 用于对象值相等。 比较整数: Integer x = 1, y = 1
我是从一道考试题中得出这个答案的,但无法理解该解决方案的工作原理。如果值“x”和“y”相等,则此函数应该返回“true”,否则返回 False。 解决方法: function equal_boolea
我将带有表情符号的文本存储在 mysql 数据库中。 数据库、表和列设置为使用utf8mb4和utf8mb4_unicode_ci。 我可以毫无问题地输入单元格值(数据类型是 VARCHAR)。 但是
如果两个 DateTime 对象具有相同的日、月和年,我该如何比较?问题是他们有不同的小时/分钟/秒。 最佳答案 对于 DateTime 对象,没有好的方法可以做到这一点。所以你必须做,比方说,不是那
我一直想知道这个问题,所以我想我会问的。 您将看到的大多数地方都使用相同的语义逻辑来覆盖 Equals 和 GetHashCode 以实现成员平等...但是它们通常使用不同的实现: publi
苹果 CoreGraphics.framework , CGGeometry.h : CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize s
在最新的python 版本中, dict 保留了插入的顺序。在平等方面是否有任何变化。例如,目前以下工作。既然广告顺序很重要, future 会不会发生这种变化? 我问是因为有根本性的变化 - 以前
class VideoUserModel(models.Model): user = models.ManyToManyField(get_user_model()) viewlist
我在 COQ 中有一个有限枚举类型(比如 T),我想检查元素是否相等。这意味着,我需要一个函数 bool beq_T(x:T,y:T) 我设法定义这样一个函数的唯一方法是逐个分析。这会导致很多匹配语
我在 Windows 7(32 位)下的 MinGW 中使用 gfortran 来编译 Fortran 代码。这是文件 testequal.f 中包含的最少代码: program test
我有以下 jsp 片段: ${campaign.moderated}
我想检查两个稀疏数组是否(几乎)相等。而对于 numpy 数组,你可以这样做: import numpy as np a = np.ones(200) np.testing.assert_array_
我有以下类(class): public class MyDocuments { public DateTime registeredDate; public
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 5 年前。 我在这里想做的是,我采用一个精度值(小于 1)并打印 1/n 类型的所有数字
我正在为我的arduino写一个草图,我想检查我的字符串的最后一个字符。 例如: 如果输入是 cats- 我想看看最后一个字符(在我的例子中是“-”)实际上是否 - 我使用的代码: 串行事件函数 vo
让我们开始: using System; public class Program { class A { public virtual void Do() { }
我只需要根据几个键(不是全部)来确定两个 HashMap 的相等性 除了单独访问每个字段并比较相等性之外,还有其他节省时间的方法吗? 最佳答案 我能想到的一种方法是在您的 HashMap 上存储某种“
在Java中,大写的Double可以为null。 但是如果我有 double a 和 b 并且我这样做: if (a.equals(b)) 如果其中之一为空,它会崩溃。有没有更好的方法来比较它们? 最
我正在尝试从我的旧数据库中插入表格数据。 Id 在数据库表和选择特定列中都相等。这是我的数据库。 旧数据库:sch -> 旧表:product (id, tag, url) (13, red, aaa
我正在开发一个应用程序,它在我的主视图中有一个侧边栏和两个 div。我试图在容器内平均分割两者的高度。我试过 height = 50% 但效果不太好。
我是一名优秀的程序员,十分优秀!