黒馬プログラマー17-6:TreeSetのComparatorコンパレータインタフェースおよびcomparareTo最適化書き方

7118 ワード

-------
androidトレーニング
JAvaトレーニング、あなたと交流することを期待します!------

package cn.itcast.p.bean;

import java.util.ArrayList;
import java.util.Iterator;


public class Person /*extends Object*/ implements Comparable {

	public static void main(String []augs){
//		Person p = new Person("p1",3);
		ArrayList al = new ArrayList();
		al.add(new Person("p1",3));
		al.add(new Person("p2",2));
		al.add(new Person("p3",3));
		al.add(new Person("p4",4));
		al.add(new Person("p5",5));
		
		Iterator it = al.iterator();
		while(it.hasNext()){
			Person p = (Person) it.next();
			System.out.println(p.getName() + " " + p.getAge());
		}

	}
	
	
	private String name;
	private int age;
	
	
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	
	@Override
	public int hashCode() {
//		System.out.println(this+".......hashCode");
		
		return name.hashCode()+age*37;
//		return 100;
	}
	@Override
	public boolean equals(Object obj) {
		
		if(this == obj)
			return true;
		// 
		if(!(obj instanceof Person))
			throw new ClassCastException(" ");
		
//		System.out.println(this+"....equals....."+obj);
		Person p = (Person)obj;
		
		
		
		return this.name.equals(p.name) && this.age == p.age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString(){
		return name+":"+age;
	}
	// TreeSet , 
	@Override
	public int compareTo(Object o) {
		
		// 
		if(!(o instanceof Person)){
			throw new ClassCastException(" ");
		}
		Person p = (Person)o;
		
		int  temp = this.age-p.age;
		return temp==0?this.name.compareTo(p.name):temp;
		
//		int  temp = this.name.compareTo(p.name);
//		return temp==0?this.age-p.age:temp;
		
		/*
		if(this.age>p.age)
			return 1;
		if(this.age<p.age)
			return -1;	
		
		else{
			
			return this.name.compareTo(p.name);
		}
		*/
		
	}
	
}


package cn.itcast.p5.treeset.demo;

import java.util.Iterator;
import java.util.TreeSet;

import cn.itcast.p.bean.Person;
import cn.itcast.p5.comparator.ComparatorByName;

public class TreeSetDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TreeSet ts = new TreeSet(new ComparatorByName());
		
		/*
		 * ��Person����������д�С���������
		 * 
		 */
		
		ts.add(new Person("zhangsan",28));
		ts.add(new Person("lisi",21));
		ts.add(new Person("zhouqi",29));
		ts.add(new Person("zhaoliu",25));
		ts.add(new Person("wangu",24));
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			
			System.out.println(p.getName()+":"+p.getAge());
		}
	
	}



	/**
	 * 
	 */
	public static void demo1() {
		TreeSet ts = new TreeSet();
		
		ts.add("abc");
		ts.add("zaa");
		ts.add("aa");
		ts.add("nba");
		ts.add("cba");
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}

package cn.itcast.p5.comparator;

import java.util.Comparator;

import cn.itcast.p.bean.Person;
/**
 * ������һ�����Person���name��������ıȽ�����
 */
public class ComparatorByName implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {

		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		// (compareTO, , )
		int temp = p1.getName().compareTo(p2.getName());
		// , 
		return temp==0?p1.getAge()-p2.getAge(): temp;
//		return 1;//����
	}

}

package cn.itcast.p5.comparator;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String)o1;
		String s2 = (String)o2;
		// ( ) , 
		int temp = s1.length()-s2.length();
		System.out.println("s1: " + s1 + "    " + "s2: "+  s2 + "  ");
		// , , 
		return temp==0? s1.compareTo(s2): temp;
	}

}


package cn.itcast.p5.treeset.test;

import java.util.Iterator;
import java.util.TreeSet;

import cn.itcast.p5.comparator.ComparatorByLength;

/* 
 * ���ַ���г�������
 * 
 * "20 18 -1 89 2 67"
 */

public class TreeSetTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TreeSet ts = new TreeSet(new ComparatorByLength());

		ts.add("aaaaa");
		ts.add("zz");
		ts.add("nbaq");
		ts.add("cba");
		ts.add("abc");
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}


TreeSetは、カスタムまたはデフォルトの比較器でソートされる要素の一意の集合です.
TreeSetの使用
|--TreeSet:Setセット内の要素をソートできます.非同期です.
要素の一意性を判断する方法:比較方法の戻り結果が0であるかどうか、0であるかどうか、同じ要素であり、保存されない.
TreeSetが要素をソートする方法1:
要素自体に比較機能を持たせるには,メタがComparableインタフェースを実現する必要がある.compareToメソッドを上書きします.
オブジェクトに含まれる自然な順序で並べ替えない場合.オブジェクトに自然な順序がない場合.どうしよう?
TreeSetコレクションの2番目のソート方法2を使用できます.
コレクション自体に比較機能を持たせ,クラス実装Comparatorインタフェースを定義し,comparareメソッドを上書きする.クラスオブジェクトをパラメータとしてTreeSetコレクションのコンストラクション関数に渡します.
-------
androidトレーニング
JAvaトレーニング、あなたと交流することを期待します!------
詳細は以下を参照してください.
http://edu.csdn.net/heima -------