JAVA TreeSet体験


詳細
これまでTreeSetに対する理解はHashMapの影響を受けてきた.HashSetもequals法で対象を区別していると考えられる.最近、あるプログラム開発でTreeSetが使用されているが、TreeSetでオブジェクトを区別することは、オブジェクトに基づいて実装されるComparableまたはComparatorインタフェースにおけるCompare()メソッドまたはCompareTo()メソッドであることが分かった.2つのオブジェクトを比較して0を返すと、1つのオブジェクトがTreeSetに挿入され、もう1つのオブジェクトがTreeSetに挿入されなくなります.HashSetはHashMapによって実現され,集合内の各オブジェクトはkeyであり,オブジェクトのHashCodeとequalsメソッドによって区別される.
次のコードを変更して結果を表示できます.
    

import java.util.*;
public class TestTreeSet {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TreeSet treeSetWithComparator = new TreeSet(new TestClassComparator());
		HashSet testHashSet = new HashSet();
		TestClass testObj1 = new TestClass(5);
		TestClass testObj2 = new TestClass(5);
		System.out.printf("
testObj1.getI == %d && testObj2.getI == %d
",testObj1.getI(),testObj2.getI()); System.out.println("testObj1 equals testObj2? " + testObj1.equals(testObj2)); System.out.println("testObj1 compares with testObj2? " + treeSetWithComparator.comparator().compare(testObj1, testObj2)); System.out.println("testObj1 == testObj2? " + (testObj1 == testObj2)); System.out.println("Hashcode of testObj1 " + testObj1.hashCode()); System.out.println("Hashcode of testObj2 " + testObj2.hashCode()); System.out.println("Add testObj1 into treeset: " + treeSetWithComparator.add(testObj1)); System.out.println("Add testObj2 into treeset: " + treeSetWithComparator.add(testObj2)); System.out.println("Add testObj1 into HashSet: " + testHashSet.add(testObj1)); System.out.println("Add testObj2 into HashSet: " + testHashSet.add(testObj2)); treeSetWithComparator.clear(); testHashSet.clear(); testObj1.setI(5); testObj2.setI(6); System.out.printf("
testObj1.getI == %d && testObj2.getI == %d
",testObj1.getI(),testObj2.getI()); System.out.println("testObj1 equals testObj2? " + testObj1.equals(testObj2)); System.out.println("testObj1 compares with testObj2? " + treeSetWithComparator.comparator().compare(testObj1, testObj2)); System.out.println("testObj1 == testObj2? " + (testObj1 == testObj2)); System.out.println("Hashcode of testObj1 " + testObj1.hashCode()); System.out.println("Hashcode of testObj2 " + testObj2.hashCode()); System.out.println("Add testObj1 into treeset: " + treeSetWithComparator.add(testObj1)); System.out.println("Add testObj2 into treeset: " + treeSetWithComparator.add(testObj2)); System.out.println("Add testObj1 into HashSet: " + testHashSet.add(testObj1)); System.out.println("Add testObj2 into HashSet: " + testHashSet.add(testObj2)); } } class TestClass{ private int i = 0; public TestClass(int i){ this.i = i; } int getI(){ return i; } void setI(int i){ this.i = i; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + i; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TestClass other = (TestClass) obj; if (i != other.i) return false; return true; } } class TestClassComparator implements Comparator{ @Override public int compare(TestClass obj1, TestClass obj2) { return obj1.getI() - obj2.getI(); } }