- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Treeset,其中人们按照金钱进行排序,但平等是根据名称进行的。我有 jack 和杰基同名“杰基”,他们被认为是平等的。 jack
添加到了 Treeset,jackie
没有。contains()
上的 javadoc 说:
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
不幸的是这条线
System.out.println(peoples.contains(jackie));
当 jackie.equals(jack) 返回 true 时,返回 false。为什么?
这是完整的代码。
public class UsingSet {
public static void main(String[] args) {
People jo = new People("Jo");
People jack = new People("Jackie");
jack.setMoney(12);
People jim = new People("Jimmy");
jim.setMoney(150);
People john = new People("John");
TreeSet<People> peoples = new TreeSet<People>();
peoples.add(jo);
peoples.add(jack);
peoples.add(jim);
peoples.add(john);
People jackie = new People("Jackie");
System.out.println("equality ? "+(jackie.equals(jack)));
System.out.println(peoples.contains(jackie));
}
}
class People extends Object implements Comparable<People> {
public static long maxCount() {
return 25000000000L;
}
String name;
Float money = 1000f;
public People(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.length());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return name;
}
@Override
public int compareTo(People other) {
int result = this.money.compareTo(other.getMoney());
if (result == 0){
//finding a second criteria
return this.name.compareTo(other.getName());
}else{
return result;
}
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
}
<小时/>
编辑:javadoc 表示,基于自然顺序的 Treeset 必须具有与 compareTo()
一致的 equals()
。带有 Comparator
的 Treeset 不能。
所以我稍微修改了代码:
Comparator<People> compareByMoney = new Comparator<People>() {
@Override
public int compare(People p1, People p2) {
int result = p1.money.compareTo(p2.getMoney());
if (result == 0){
//finding a second criteria
return p1.name.compareTo(p2.getName());
}else{
return result;
}
}
};
TreeSet<People> peoples = new TreeSet<People>(compareByMoney);
...
System.out.println(peoples.contains(jackie)); //--> true
最佳答案
jackie 并不正式等于
jack,因为他们没有相同数量的钱(请注意,您的 equals 方法仅检查名称,而不检查钱)。
您正在使用金钱属性来比较树集中的它们。由于 jackie 有 1000 个钱,而 jack 有 12 个,因此它们对于树集来说并不相同,因此包含 return false..
如果你这样做
People jackie = new People("Jackie");
jackie.setMoney(12);
您会发现它对两者都输出 true,或者如果您的 compareTo
方法只是:
@Override
public int compareTo(People other) {
return this.name.compareTo(other.getName());
}
它还会输出true
。
因此,您需要更改 equals
方法来比较 money
金额,或者仅使用 compareTo
方法中的名称。
如果您阅读了文档:
Note that the ordering maintained by a set (whether or not an explicit comparator is provided) must be consistent with equals if it is to correctly implement the Set interface. (See Comparable or Comparator 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 TreeSet instance 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 set, equal
一致:
The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C
通过您的代码,我们有:
System.out.println("equality ? "+(jackie.equals(jack))); //equality ? true
System.out.println(jackie.compareTo(jack)); //1
您的类(class)的自然顺序与 equals 不一致。因此,不要指望您的 treeSet 具有正常行为。
关于java - 为什么树集找不到这个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21015833/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!