【发布时间】:2011-11-16 12:13:31
【问题描述】:
请检查代码:
/* 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 排序
【问题讨论】:
-
你的问题没有意义。
TreeSet使用compareTo()方法,而不是equals()或hashCode()方法,来确定排序顺序(这是对等式的概括,在排序集的上下文中)。如果这些不是所需的语义,使用不同的数据结构。也就是说:caveat emptor - 有很好的理由说明为什么树集不使用equals()来实现对象相等。如果a.compareTo(b)是0但a.equals(b)是false怎么办?如果a.compareTo(b)不为零,但a.equals(b)是true,该怎么办? -
谢谢!请告知适当的数据容器。我需要按键(
TestClass.value)快速检索元素,但键可能重复