2012-04-11 19 views
3

我檢查如何TreeSet的檢查重複的元素,並具有以下代碼如何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] 

我的問題是: -

  • 即使我沒有實現hashCode和equals方法(我沒有實現Comparable接口,因爲它的強制並需要保持Set排序),TreeSet是如何確定重複的?
  • 它使用了Object類的默認實現嗎?它看起來像它使用「標題」字段進行此檢查,因爲當我添加將它視爲重複,但是當我添加它不會將其視爲重複。

謝謝。

+0

從Comparable接口文檔中,它表示:「強烈建議...自然排序與平等一致。」 – newacct 2012-04-11 05:10:47

回答

5

TreeSet(或在技術上,該支持它的TreeMap)僅使用compareTo()功能的元素進行比較。 它不使用Object.equals().hashCode()。此外,如果使用過其中任何一個,你的輸出會一直

[song1, song2, song3, song3] 

因爲Object的默認實現使用的內存地址以測試對象的平等,而不是他們的成員。

+2

是的,我稍後才意識到,TreeSet只使用compareTo(實現Comparable)或比較(實現Comparator)進行排序和重複檢查。它是使用equals和hashCode的Hashset。 – Ankur 2012-04-11 04:39:02

1

比較返回< 0,0或> 0 ...因此等於通過的compareTo實現返回0。因此

if (node1.compareTo(node2) == 0) 

那麼該節點已經在集合