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