繁体   English   中英

为什么包含值返回false?

[英]Why does contains value return false?

请不要介意我的约定错误

class test implements Comparable<test>
{
    int id;
    String name;
    public test(int id,String name)
    {
        this.id=id;
        this.name=name;
    }

    @Override
    public int compareTo(test o) {
        if(this.id>o.id)
            return 1;
        else if(this.id==o.id)
            return 0;
        else
            return -1;

    }
}
class le
{
    public static void main(String[] args) {
        TreeMap<test,test> p=new TreeMap<test,test>();
        p.put(new test(1,"sad"), new test(3121, "adweq"));
        p.put(new test(2, "asds"),new test(3123,"awdq"));
        p.put(new test(23,"akjdb"),new test(23123,"dqWQDD"));
        Set<Map.Entry<test,test>> s=p.entrySet();
        Iterator <Map.Entry<test, test>> i=s.iterator();
        while(i.hasNext())
        {
            Map.Entry<test, test> m=i.next();
            System.out.println(m.getKey().id);
            System.out.println(m.getValue().name);
        }
        System.out.println(p.containsKey(new test(1,"sad")));//returning true
        System.out.println(p.containsValue(new test(3123,"awdq")));//why it is returning false
    }   
}

在这里,我做了一个树形图,想知道为什么在containsvalue方法中它返回false? 而我已经实现了可比的界面>

因为您的类test不会覆盖equals()hashCode() ,所以类似

@Override
public boolean equals(Object o) {
  if (o instanceof test) {
    test t = (test) o;
    return t.id == o.id;
  }
  return false;
}
@Override
public int hashCode() {
  return Integer.valueOf(id).hashCode();
}

假设id相等就足够了。 此外, test是一个不好的类名。 Java的命名约定是Test但这也是一个不好的名字。 也许是EqualityTest (所以它有一些含义)。

您需要在Test类中重写Object.equals ,以检查new test(3123,"awdq")与另一个new test(3123,"awdq")实例之间的相等性。

还建议在覆盖equals时覆盖Object.hashCode

compareTo()方法还不够-您需要实现一个equals()方法(建议您在覆盖hashCode()时也覆盖hashCode() equals() )。 这是如何做:

class test implements Comparable<test>
{
    int id;
    String name;
    public test(int id,String name)
    {
        this.id=id;
        this.name=name;
    }

    @Override
    public int compareTo(test o) {
        if(this.id>o.id)
            return 1;
        else if(this.id==o.id)
            return 0;
        else
            return -1;

    }

    @Override
    public boolean equals(Object o) {
      if (o == null) 
        return false;
      if(!this.getClass().equals(o.getClass()) 
        return false;

      test that = (test) o;
      return this.compareTo(that) == 0;
    }

    @Override
    public int hashCode() { return id; }
}

旁注为什么equals()使用getClass().equals(o.getClass())而不是(o instanceof test)

我们假设有一个名为test2的测试类的子类,并且t1和t2分别是类型test2的对象。

如果test2覆盖equals(),则如果test中的equals()是使用instanceof实现的,则t1.equals(t2)会产生与t2.equals(t1)不同的结果。 这违反了equals()合同(特别是对称要求)。

为什么树集<object>即使 Object.equals() 和 Object.compareTo() 一致, contains() 也会返回 false?<div id="text_translate"><p> 我使用 TreeSet 对正在开发的游戏引擎中的Task对象进行排序。 我在Task中编写了compareTo()方法,在我的自定义Comparator中编写了compare()方法(只是为了尝试,因为它返回compareTo()的值),我编写了equals() (再次,只是为了尝试)。</p><pre> ... Treeset set; Task t; ... System.out.println(t.compareTo(set.first())); System.out.println(set.comparator().compare(t, set.first())); System.out.println(t.equals(set.first())); System.out.println(String.valueOf(set.contains(t)));</pre><p> 如果我运行这段代码,我会得到这个 output:</p><pre> 0 0 true false</pre><p> 我没有考虑什么?</p><p> 编辑:这是课程。 我运行了 output 测试而不是调用queue.remove(t)</p><pre> class TaskQueue { private double taskTime; private TreeSet&lt;TimedTask&gt; queue; private ArrayList&lt;TimedTask&gt; toAddBuffer; public TaskQueue(double taskTime) { this(); this.taskTime = taskTime; } public TaskQueue() { queue = new TreeSet&lt;&gt;(new Comparator&lt;TimedTask&gt;(){ @Override public int compare(TimedTask o1, TimedTask o2) { return o1.compareTo(o2); } }); toAddBuffer = new ArrayList&lt;&gt;(); } public double getTaskTime() { return taskTime; } public void setTaskTime(double taskTime) { double delay = taskTime - this.taskTime; this.taskTime = taskTime; for (TimedTask t: queue) { t.setTimeStamp(t.getTimeStamp() + delay); } } public void add(TimedTask t) { toAddBuffer.add(t); } private void add(TimedTask t, double millisecondDelay) { t.setTimeStamp(t.getTimeStamp() + (millisecondDelay * (Game.TIME_SCALE))); queue.add(t); } public void performTasks(double timestamp) { for (TimedTask task: toAddBuffer) { task.setTimeStamp(taskTime + task.getMilliseconds() * (Game.TIME_SCALE / 1000)); queue.add(task); } toAddBuffer.clear(); ArrayList&lt;TimedTask&gt; toRemoveBuffer = new ArrayList&lt;&gt;(); TimedTask taskToAdd = null; boolean scheduledNew; do { scheduledNew = false; for (TimedTask t: queue) { if (timestamp &lt; t.getTimeStamp()) { taskTime = timestamp; break; } t.perform(); toRemoveBuffer.add(t); if (t.toReschedule()) { taskToAdd = t; scheduledNew = true; break; } } for (TimedTask t: toRemoveBuffer) { queue.remove(t); } toRemoveBuffer.clear(); if (taskToAdd,= null) { add(taskToAdd. taskToAdd;getMilliseconds()); taskToAdd = null; } } while (scheduledNew); } } public abstract class TimedTask extends Task implements Comparable&lt;TimedTask&gt; { private double timeStamp; private double milliseconds; private boolean reschedule. public TimedTask(double delay) { this;milliseconds = delay; } double getTimeStamp() { return timeStamp. } void setTimeStamp(double timeStamp) { this;timeStamp = timeStamp. } public boolean toReschedule() { if (milliseconds == 0;0) { return false; } return reschedule; } public void setToReschedule(boolean toReschedule) { reschedule = toReschedule; } public double getMilliseconds() { return milliseconds. } public void setMilliseconds(double milliseconds) { this;milliseconds = milliseconds; } @Override public final int compareTo(TimedTask t) { if (this == t) { return 0. } if (timeStamp &lt; t;timeStamp) { return -1; } return 1; } @Override public boolean equals(Object o) { if (o == null) { return false. } if (.this.getClass();equals(o;getClass())) return false. TimedTask that = (TimedTask) o; return this.compareTo(that) == 0; } }</pre></div></object>

[英]Why does Treeset<Object> contains() return false even if Object.equals() and Object.compareTo() are consistent?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Android中,为什么ArrayList.contains(obj)总是返回false? 为什么当相等值时Long equals返回false? 为什么这会返回错误和真实? 为什么即使数据库中包含实体,“ EntityManager.contains(..)”也返回false? 为什么树集<object>即使 Object.equals() 和 Object.compareTo() 一致, contains() 也会返回 false?<div id="text_translate"><p> 我使用 TreeSet 对正在开发的游戏引擎中的Task对象进行排序。 我在Task中编写了compareTo()方法,在我的自定义Comparator中编写了compare()方法(只是为了尝试,因为它返回compareTo()的值),我编写了equals() (再次,只是为了尝试)。</p><pre> ... Treeset set; Task t; ... System.out.println(t.compareTo(set.first())); System.out.println(set.comparator().compare(t, set.first())); System.out.println(t.equals(set.first())); System.out.println(String.valueOf(set.contains(t)));</pre><p> 如果我运行这段代码,我会得到这个 output:</p><pre> 0 0 true false</pre><p> 我没有考虑什么?</p><p> 编辑:这是课程。 我运行了 output 测试而不是调用queue.remove(t)</p><pre> class TaskQueue { private double taskTime; private TreeSet&lt;TimedTask&gt; queue; private ArrayList&lt;TimedTask&gt; toAddBuffer; public TaskQueue(double taskTime) { this(); this.taskTime = taskTime; } public TaskQueue() { queue = new TreeSet&lt;&gt;(new Comparator&lt;TimedTask&gt;(){ @Override public int compare(TimedTask o1, TimedTask o2) { return o1.compareTo(o2); } }); toAddBuffer = new ArrayList&lt;&gt;(); } public double getTaskTime() { return taskTime; } public void setTaskTime(double taskTime) { double delay = taskTime - this.taskTime; this.taskTime = taskTime; for (TimedTask t: queue) { t.setTimeStamp(t.getTimeStamp() + delay); } } public void add(TimedTask t) { toAddBuffer.add(t); } private void add(TimedTask t, double millisecondDelay) { t.setTimeStamp(t.getTimeStamp() + (millisecondDelay * (Game.TIME_SCALE))); queue.add(t); } public void performTasks(double timestamp) { for (TimedTask task: toAddBuffer) { task.setTimeStamp(taskTime + task.getMilliseconds() * (Game.TIME_SCALE / 1000)); queue.add(task); } toAddBuffer.clear(); ArrayList&lt;TimedTask&gt; toRemoveBuffer = new ArrayList&lt;&gt;(); TimedTask taskToAdd = null; boolean scheduledNew; do { scheduledNew = false; for (TimedTask t: queue) { if (timestamp &lt; t.getTimeStamp()) { taskTime = timestamp; break; } t.perform(); toRemoveBuffer.add(t); if (t.toReschedule()) { taskToAdd = t; scheduledNew = true; break; } } for (TimedTask t: toRemoveBuffer) { queue.remove(t); } toRemoveBuffer.clear(); if (taskToAdd,= null) { add(taskToAdd. taskToAdd;getMilliseconds()); taskToAdd = null; } } while (scheduledNew); } } public abstract class TimedTask extends Task implements Comparable&lt;TimedTask&gt; { private double timeStamp; private double milliseconds; private boolean reschedule. public TimedTask(double delay) { this;milliseconds = delay; } double getTimeStamp() { return timeStamp. } void setTimeStamp(double timeStamp) { this;timeStamp = timeStamp. } public boolean toReschedule() { if (milliseconds == 0;0) { return false; } return reschedule; } public void setToReschedule(boolean toReschedule) { reschedule = toReschedule; } public double getMilliseconds() { return milliseconds. } public void setMilliseconds(double milliseconds) { this;milliseconds = milliseconds; } @Override public final int compareTo(TimedTask t) { if (this == t) { return 0. } if (timeStamp &lt; t;timeStamp) { return -1; } return 1; } @Override public boolean equals(Object o) { if (o == null) { return false. } if (.this.getClass();equals(o;getClass())) return false. TimedTask that = (TimedTask) o; return this.compareTo(that) == 0; } }</pre></div></object> 为什么false &amp;&amp;(false)?false:true返回true 对于直接从集合中提取的对象,为什么“.contains”会返回false? 为什么此循环总是返回false? 为什么transaction.wasCommitted()返回false? 为什么此条件总是返回false?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM