4

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 and equalsメソッドを実装していなくても(Comparableインターフェースは必須であり、Setをソートしておく必要があるため実装しました)、TreeSetはどのようにして重複を判別しましたか?
  • Objectクラスのデフォルト実装を使用しましたか?追加すると重複として扱われるので、このチェックに「タイトル」フィールドを使用したように見えますが、追加すると重複として扱われません。

ありがとう。

4

3 に答える 3

6

TreeSet(または技術的には、TreeMapそれを裏付けるもの)はcompareTo()、要素を比較するために関数を使用するだけです。Object's.equals()または。は使用しません.hashCode()。さらに、それらのいずれかを使用した場合、出力は次のようになります。

[song1, song2, song3, song3]

Objectのデフォルトの実装では、メンバーではなく、メモリアドレスを使用してオブジェクトの同等性をテストしているためです。

于 2012-04-11T04:22:55.580 に答える
2

コンパレータは<0、0、または> 0を返します...したがって、equalsはcompareToが0を返すことによって実装されます。

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

その場合、ノードはすでにセットに含まれています

于 2012-04-11T04:12:29.210 に答える
1

TreeSetは、ハッシュではなく、メンバーの順序(ComparableまたはComparatorインターフェイスを介して)に基づいて、バランスの取れたバイナリ検索ツリーを実装します。

http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree

于 2012-04-11T04:15:50.617 に答える