请查看代码:
/* Run1.java */
package test;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class Run1
{
static public void main(String[] args)
{
SortedSet<TestClass> s = new TreeSet<TestClass>();
s.add( new TestClass("name1", 100) );
s.add( new TestClass("name2", 10) );
s.add( new TestClass("name3", 1) );
s.add( new TestClass("name4", 10) );
s.add( new TestClass("name5", 100) );
Iterator<TestClass> it = s.iterator();
while(it.hasNext())
{
TestClass t = it.next();
System.out.println( t.name+' '+t.value );
}
}
}
/* TestClass.java */
package test;
public class TestClass implements Comparable<TestClass>
{
public String name;
public int value;
public TestClass(String name, int value) {
this.name = name;
this.value = value;
}
public int compareTo(TestClass o)
{
return this.value - o.value;
}
public boolean equals(Object o)
{
if (!(o instanceof TestClass))
return false;
TestClass n = (TestClass)o;
return this.name.equals(n.name);
}
public int hashCode()
{
return 31*name.hashCode();
}
public String toString()
{
return name;
}
}
打印
name3 1
name2 10
name1 100
因为我看到因为compareTo
用于检查相等(返回0时)。但我需要按字段TestClass.name
检查是否为唯一,并且只按TestClass.value
答案 0 :(得分:2)
compareTo()
和equals()
的结果在这种情况下需要兼容,这意味着您需要在比较中考虑相等性。例如:
public int compareTo(TestClass o)
{
return (this.value == o.value) ? this.name.compareTo(o.name) : this.value - o.value;
}
为具有相同值的对象引入了名称的子顺序,使得结果与您的equals()
实现兼容。
答案 1 :(得分:2)
如何对compareTo方法进行黑客攻击如下:
public int compareTo(TestClass o)
{
if (this.name != null && this.name.equals(o.name)) {
return 0;
}
return this.value - o.value;
}
这应该在对值
进行排序时对名称进行等式检查(删除重复项)答案 2 :(得分:1)
如果我理解正确,那么你想要的是你的compareTo总是为类实现“自然顺序”。这意味着类的客户端期望该类行为的方式。契约地,compareTo应该与equals一致,这就是为什么我总是将equals实现为:
return compareTo(obj)==0;
这保证了一致性。
然后,如果你想要另一个排序顺序,你应该实现另一个实现Comparable的类。通过这种方式,您可以拥有类一致性和单独的排序顺序。
答案 3 :(得分:0)
写入比较TestClass对象的比较器。
public class TVComparator implements Comparator<TestClass> {
public int compare(TestClass o1, TestClass o2) {
if (o1.name.equals(o2.name)) return 0;
return o1.value - o2.value;
}
}
为简单起见,我省略了对空值的任何检查。