Java 检查二维地图中的重复项
Java check for duplicates into bidimensional map
我想知道如何在二维地图中检查重复项。
问题是关于这个示例代码
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map
= new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(map.keySet().contains(pair2));
System.out.println(map.containsKey(pair2));
System.out.println(map.get(pair2)!=null);
为什么输出是:
false
false
false
?
如何检查重复项?
提前致谢
我怀疑你的对 class 没有正确定义 equals()
和 hashCode()
。
如果Pair
是这样定义的:
public class Pair<T, U>{
T First;
U Second;
}
然后你就会看到你得到的结果。默认情况下 java 使用对象标识作为相等比较,因此即使两个不同的对具有相同的内容,它们也会不相等。您可以覆盖 equals
和 hashCode
以提供更有意义的比较。
public class Pair<T, U>{
T First;
U Second;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Pair<?, ?> pair = (Pair<?, ?>) o;
if (First != null ? !First.equals(pair.First) : pair.First != null) {
return false;
}
return !(Second != null ? !Second.equals(pair.Second) : pair.Second != null);
}
@Override
public int hashCode() {
int result = First != null ? First.hashCode() : 0;
result = 31 * result + (Second != null ? Second.hashCode() : 0);
return result;
}
}
这将在与您的代码一起使用时产生:
true
true
true
因为您在 java.lang.Object
class 中隐含地使用了方法 pair1.equals(pair2)
比较。定义为:
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
(Java 8 API
)
由于您的 Pair
class 不会覆盖 .hashCode()
和 .equals(Object other)
方法 => 比较 x == y
return false
.
这可行:
public class NewClass {
static class Pair<I,S>{
private I First;
private S Second;
@Override
public int hashCode(){
return First.hashCode() + 23*Second.hashCode();
}
@Override
public boolean equals(Object other){
Pair<I, S> otherPair = (Pair<I, S>) other;
return (this == null ? otherPair == null : (this.First == otherPair.First && this.Second == otherPair.Second));
}
}
public static void main(String[] args) {
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map = new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(pair1.equals(pair2));
System.out.println(map.containsKey(pair2));
}
}
我想知道如何在二维地图中检查重复项。 问题是关于这个示例代码
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map
= new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(map.keySet().contains(pair2));
System.out.println(map.containsKey(pair2));
System.out.println(map.get(pair2)!=null);
为什么输出是:
false
false
false
? 如何检查重复项? 提前致谢
我怀疑你的对 class 没有正确定义 equals()
和 hashCode()
。
如果Pair
是这样定义的:
public class Pair<T, U>{
T First;
U Second;
}
然后你就会看到你得到的结果。默认情况下 java 使用对象标识作为相等比较,因此即使两个不同的对具有相同的内容,它们也会不相等。您可以覆盖 equals
和 hashCode
以提供更有意义的比较。
public class Pair<T, U>{
T First;
U Second;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Pair<?, ?> pair = (Pair<?, ?>) o;
if (First != null ? !First.equals(pair.First) : pair.First != null) {
return false;
}
return !(Second != null ? !Second.equals(pair.Second) : pair.Second != null);
}
@Override
public int hashCode() {
int result = First != null ? First.hashCode() : 0;
result = 31 * result + (Second != null ? Second.hashCode() : 0);
return result;
}
}
这将在与您的代码一起使用时产生:
true
true
true
因为您在 java.lang.Object
class 中隐含地使用了方法 pair1.equals(pair2)
比较。定义为:
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
(Java 8 API
)
由于您的 Pair
class 不会覆盖 .hashCode()
和 .equals(Object other)
方法 => 比较 x == y
return false
.
这可行:
public class NewClass {
static class Pair<I,S>{
private I First;
private S Second;
@Override
public int hashCode(){
return First.hashCode() + 23*Second.hashCode();
}
@Override
public boolean equals(Object other){
Pair<I, S> otherPair = (Pair<I, S>) other;
return (this == null ? otherPair == null : (this.First == otherPair.First && this.Second == otherPair.Second));
}
}
public static void main(String[] args) {
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map = new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(pair1.equals(pair2));
System.out.println(map.containsKey(pair2));
}
}