我正在检查TreeSet如何检查重复元素并具有以下代码
import java.util.*;
public class TreeDemo{
public static void main(String[] args)
{
new TreeDemo().go();
}
public void go()
{
Song s1 = new Song("song1","artist1");
Song s2 = new Song("song2","artist2");
Song s3 = new Song("song3","artist3");
Song s4 = new Song("song3","artist3");
Set<Song> tree = new TreeSet<Song>();
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
System.out.println(tree);
}
}
class Song implements Comparable<Song>{
private String title;
private String artist;
public Song(String t, String a)
{
title=t;
artist=a;
}
public String getTitle(){
return title;
}
public int compareTo(Song s){
//Song s = (Song)o;
return title.compareTo(s.getTitle());
}
public String toString(){
return title;
}
}
当我执行此代码时,我得到以下输出
[song1, song2, song3]
我的问题是: -
感谢。
答案 0 :(得分:6)
TreeSet
(或技术上支持它的TreeMap
)仅使用compareTo()
函数来比较元素。
它不使用Object
的{{1}}或.equals()
。而且,如果它使用了它们中的任何一个,那么你的输出就是
.hashCode()
因为[song1, song2, song3, song3]
的默认实现使用内存地址来测试对象的相等性,而不是它们的成员。
答案 1 :(得分:1)
比较器返回&lt; 0,0或&gt; 0 ...所以equals是通过compareTo返回0实现的。因此
if (node1.compareTo(node2) == 0)
然后节点已经在集合
中答案 2 :(得分:1)
TreeSet基于其成员的排序(通过Comparable或Comparator接口)实现平衡的二叉搜索树,而不是散列。
http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree