java set和set比较_java TreeSet:比较和相等

我认为您遇到的问题是您正在实现

Comparable,但您的实现似乎与equals不一致 – 并且您没有实现任何相等的方法.那是:

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

在您的情况下,当您构建这三个对象时:

MyObj o1 = new MyObj(99,1);

MyObj o2 = new MyObj(11,9);

MyObj o3 = new MyObj(1234, 1);

你会看到o1.compareTo(o3)== -1,而o1.equals(o3)== false.

但你似乎想要o1.equals(o3)== true.

此外,如果对象已存在于集合中,则认识到TreeSet.add()返回false.此检查基于equals()方法.

要解决此问题,请覆盖Object.equals()和Object.hashCode(),以便它们考虑MyObj.id字段,并在compareTo()方法不相等时继续使用sort_1字段.

package javaapplication1;

import java.util.TreeSet;

public class MyObj implements Comparable {

public long sort_1;

public long id;

public MyObj(long sort, long id) {

this.sort_1 = sort;

this.id = id;

}

@Override

public int compareTo(MyObj other) {

return (this.equals(other))? 0 : Long.compare(sort_1, other.sort_1);

}

@Override

public boolean equals(Object obj) {

MyObj other = (MyObj) obj;

return this.id == other.id && this.sort_1 == other.sort_1;

}

@Override

public int hashCode() {

return (int) id;

}

public String toString() {

return id + ":" + sort_1;

}

public static void main(String[] args) {

TreeSet lst = new TreeSet();

MyObj o1 = new MyObj(99L, 1L);

MyObj o2 = new MyObj(11L, 9L);

MyObj o3 = new MyObj(1234L, 1L);

MyObj o4 = new MyObj(1234L, 1L);

System.out.println( "Adding o1: " + lst.add(o1));

System.out.println( "Adding o2: " + lst.add(o2));

System.out.println( "Adding o3: " + lst.add(o3));

System.out.println( "Adding o4: " + lst.add(o4));

System.out.println(lst);

System.out.println("o1.compareTo(o3) : " + o1.compareTo(o3));

System.out.println("o1.equals(o3) : " + o1.equals(o3));

//remove myObje with id 1

boolean remove = lst.remove(o3);

System.out.println(lst);

}

}

输出:

Adding o1: true

Adding o2: true

Adding o3: true

Adding o4: false

[9:11, 1:99, 1:1234]

o1.compareTo(o3) : -1

o1.equals(o3) : false

[9:11, 1:99]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值