Пожалуйста, просмотрите код:
/* 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()
, для определения порядка сортировки (что является обобщением равенства в контексте отсортированного множества). Используйте другую структуру данных, если это не является желаемой семантикой. Тем не менее: предостережение emptor - есть очень веские причины, по которым набор деревьев не используетequals()
для равенства объектов. Что, еслиa.compareTo(b)
— это0
, аa.equals(b)
— этоfalse
? Что, еслиa.compareTo(b)
не равно нулю, аa.equals(b)
равноtrue
? - person Matt Ball   schedule 16.11.2011TestClass.value
), но ключ может дублироваться - person triclosan   schedule 16.11.2011