gpt4 book ai didi

java - 如何在与Equal和hashcode一致的情况下实现compareTo()方法

转载 作者:行者123 更新时间:2023-12-02 12:44:43 24 4
gpt4 key购买 nike

我有一个 Product 类,其中三个变量:

class Product implements Comparable<Product>{
private Type type; // Type is an enum
Set<Attribute> attributes; // Attribute is a regular class
ProductName name; // ProductName is another enum
}

我使用Eclipse自动生成equal()和hashcode()方法:

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attributes == null) ? 0 : attributes.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Product other = (Product) obj;
if (attributes == null) {
if (other.attributes != null)
return false;
} else if (!attributes.equals(other.attributes))
return false;
if (type != other.type)
return false;
return true;
}

现在在我的应用程序中,我需要对一组产品进行排序,因此我需要实现 Comparable 接口(interface)和compareTo 方法:

@Override
public int compareTo(Product other){
int diff = type.hashCode() - other.getType().hashCode();
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}

diff = attributes.hashCode() - other.getAttributes().hashCode();

if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}

return 0;
}

这个实现有意义吗?如果我只想根据“类型”和“属性”值的字符串值对产品进行排序,该怎么办?那么如何实现呢?

编辑:我想要对 Set 进行排序的原因是因为我有 Junit 测试,它对 HashSet 的字符串值进行断言。我的目标是在对集合进行排序时保持相同的输出顺序。否则,即使 Set 的值相同,由于 Set 的随机输出,断言也会失败。

编辑2:通过讨论,很明显,在单元测试中断言 HashSet 的 String 值相等并不好。对于我的情况,我目前编写了一个 sort() 函数来按自然顺序对 HashSet String 值进行排序,因此它可以始终为我的单元测试输出相同的 String 值,目前就足够了。谢谢大家。

最佳答案

从这里的所有评论看来,您根本不需要使用Comparator。因为:

1) 您使用的 HashSet 不能与 Comparator 配合使用。未订购。

2) 您只需确保包含 Product 的两个 HashSet 相等。这意味着它们大小相同并且包含相同的Product集。

由于您已经向 Product 添加了 hashCodeequals 方法,因此您需要做的就是调用 equals 方法在那些 HashSet 上。

HashSet<Product> set1 = ...
HashSet<Product> set2 = ...

assertTrue( set1.equals(set2) );

关于java - 如何在与Equal和hashcode一致的情况下实现compareTo()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com