TreeSet類のオブジェクトの比較

3433 ワード

TreeSet類はHashSet類と似ています。しかし、数集は秩序ある集合である。ツリーに要素を追加するたびに、正しい並べ替え位置に配置されます。
    TreeSetはどのように並べばいいのか分かりますか?API文書には、The elemens ardersed using their nature ordeng、or by a Comprator provided at creation time、depending on which construct is usedと書かれています。 要素の自然な順序を使って要素を並べ替えたり、setを作成する時に提供されるCompratorによって並べ替えたりしますが、具体的には使用する構造方法によって異なります。
1、ツリーセットに挿入された要素はComprableインターフェース、すなわち元素を使用した自然な順序で並べ替えられます。
ここではPersonクラスを定義し、TreeSetに挿入し、IDで並べ替えます。
import java.util.*;

public class Person implements Comparable
{
	private String name;
	private int id;
	
	public Person(String n,int i)
	{
		name = n;
		id = i;
	}
	
	public String getName()
	{
		return name;
	}
	
	public int getId()
	{
		return id;
	}
	
	public int compareTo(Person other)//  id    
	{
		return Integer.compare(id,other.id);
	}
	
	public String toString()
	{
		return "[Name="+name+",Id="+id+"]";
	}
}
テストしてください。
import java.util.*;

public class TreeSetT
{
	public static void main(String []args)
	{
		SortedSet p = new TreeSet<>();
		p.add(new Person("Coolbenn",24));
		p.add(new Person("Jack",21));
		p.add(new Person("Allen",25));
		
		System.out.println(p);
		
		}
}
は、次のような結果を得た。
[[name=Jack,id = 21],[name=Coolbenn,id=24],[name=Allen,id=25]]
可視要素の順序は、idの値で配列されている。
2、コンパレータ付きのツリーを作り、ツリーセットに異なる比較方法を教えます。
API文書で見られるTreeSetの構築器を参照してください。
public TreeSet(Comparator super E> comparator)
Constructs a new,empty tree set,sorted according to the specified comprator.All elements inserted into the set must be mututally comprable by the specified comprator:
指定されたコンパレータに従って並べ替えられた新しい空TreeSetを作成します。このセットに挿入されたすべての要素は、指定されたコンパレータによって相互に比較することができる必要があります。
まずCompratorオブジェクトを実現する必要があります。しかし、インターフェースは実装されていないので、Compratorインターフェースのクラスを実現することにより、オブジェクトを実現します。
以下はPersonクラスのnameを通じてソート規則に変更されます。
import java.util.*;

public class TreeSetT
{
	public static void main(String []args)
	{
		SortedSet p = new TreeSet<>();
		p.add(new Person("Coolbenn",24));
		p.add(new Person("Jack",21));
		p.add(new Person("Allen",25));
		
		//System.out.println(p);
		
		class PersonComparator implements Comparator//     
		{
			public int compare(Person a,Person b)
			{
				String NameA = a.getName();
				String NameB = b.getName();
				return NameA.compareTo(NameB);
			}
		}
		
		PersonComparator com = new PersonComparator();
		SortedSet sortbyName = new TreeSet<>(com);//            ,        compare()     。
		
		sortbyName.addAll(p);
		System.out.println(sortbyName);
	}
}
は結果を見ます。
[[name=Allen,id=25],[name=Coolbenn,id=24],[name=Jack,id = 21]]
可視並べ替えは、name文字列のアルファベット順に並べ替えられている。
3、コンパレータを匿名の内部クラスのインスタンスに定義する
このコンパレータには何のデータもありません。比較方法の保持器、すなわちクラス内部には一つのcompre()方法しか定義されていません。このようなオブジェクトを関数オブジェクトと呼ぶことがあります。関数オブジェクトは通常匿名の内部クラスのインスタンスとして定義される。
SortedSet sortbyName = new TreeSet<>(new Comparator)
		{
			public int compare(Person a,Person b)
			{
				String NameA = a.getName();
				String NameB = b.getName();
				return NameA.compareTo(NameB);
			}
		}
与えられたクラスに対しては、一回だけComprableインターフェースを実現することができます。1つのセットの中でidで並べ替える必要がある場合、別のセットの中でnameで並べ替えられます。この場合、コンパレータ付きツリーを構築することができます。