`

TreeSet

阅读更多

 

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/*
 * TreeMap实现
 * 红黑树http://baike.baidu.com/view/133754.html
 */
public class TestTreeSet {

	public TestTreeSet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TreeSet<String> ts = new TreeSet<String>(new InstanceComparator());
		ts.add("aa");
		ts.add("BB");
		ts.add("bb"); // BB和bb被认为是相同的元素,因为BB首先输入,所以打印的是bb
		ts.add("DD");

		System.out.println(ts.first());
		System.out.println(ts.last());

		loadSet(ts);

		if (ts.contains("bb")) {
			System.out.println("Contains bb/BB");
		}

		/*
		 * 返回此 set 的部分视图,要求其元素严格小于 toElement。
		 */
		TreeSet<String> subTs = (TreeSet) ts.headSet("ab");
		loadSet(subTs);

		/*
		 * subTs和ts里面的元素是共享的
		 * 
		 */
		System.out.println("------->subTs and ts store the same objects");
		subTs.clear();
		loadSet(subTs);
		loadSet(ts);
		/*
		 * 报错headSet("ab");
		 * 
		 * subTs.add("a");
		 */
		System.out.println("------->subTs and ts store the same objects");
		subTs.add("tt");
		loadSet(ts);
		loadSet(subTs);
		ts.remove("aa");
		loadSet(ts);
		loadSet(subTs);
	}

	public static void loadSet(Set s) {
		Iterator iter = s.iterator();

		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
	}

}

class InstanceComparator implements Comparator {
	/*比较用来排序的两个参数。随第一个参数小于、等于或大于第二个参数而分别返回负整数、零或正整数。
	实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)

	实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。

	最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。

	虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背了这一点的 comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 comparator 强行进行与等号一致的排序。” 

*/	public int compare(Object o1, Object o2) {
		String text1 = o1.toString();
		String text2 = o2.toString();
		return -(text1.compareToIgnoreCase(text2));

	}
/*
 * 
 * 比较两个comparator,和我们一个collection集合排序没有关系
 * 因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
 * 两个不同的comparator!
 */
	public boolean equals(Object obj) {
		return this.equals(obj);

	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics