Set 집합 하위 클래스 HashSet, TreeSet

 Set:  ,     。
 Set         Collection    。          。   。
 
 	 |-HashSet:          ,          。
			HashSet              ?
			     hashCode   equals            。
			  hashCode   ,        equals     true
			  hashCode   ,    equals  。
			
			HashSet contains remove    hashCode  ,          ,   equals  。
			
	 |-TreeSet:    Set               。        。
			          :          0.
			       :   。(     )
		
                   :        ,            。  ,       Comparable  ,          。
			  Comparable     int CompareTo()  ,          ,
			  :           
			0,           
			  :                ,      。
			          。       java.lang.Comparable  ,  compareTo    。
			
			  ,            ,            ,      。
			  ,             ,            。          。
			      ?
		        :        。
			              。
			         java.util.Comparator  ,  compare  。  Comparator            
			   TreeSet      。

 

 HashSet 의 예 를 살 펴 보 겠 습 니 다.
 
public class HashSetOverView {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add(new Person("abc0",20));
		hs.add(new Person("abc6",26));
		hs.add(new Person("abc1",21));
		hs.add(new Person("abc6",26));
		Iterator it = hs.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			System.out.println(p.getName()+"--"+p.getAge());
		}
		
//		System.out.println(hs.contains(new Person("abc6",26)));       equals  ,      。
	}
}

class Person 
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	
	public int hashCode()
	{
		System.out.println(this.name+"...hashCode");
		final int NUMBER = 49;
		return name.hashCode()+age*NUMBER;
	}
	
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Person))
			throw new ClassCastException("     ");
		Person p = (Person)obj;
		System.out.println(this.name+"  equals run  "+p.name);
		return this.name.equals(p.name) && this.age==p.age;
	}
	public String toString()
	{
		return name+"::"+age;
	}
}

 HashSetOverView 클래스 의 main 방법 실행 결 과 는 다음 과 같 습 니 다.
abc0...hashCode
abc6...hashCode
abc1...hashCode
 
abc6...hashCode
abc6  equals run  abc6
 
abc0--20
abc1--21
 
abc6--26
 
트 리 셋 집합 의 예 가 요소 의 질서 와 유일 성 을 어떻게 유지 하 는 지 살 펴 보 겠 습 니 다.
 
package cn.java.collection.set;

import java.util.TreeSet;

/*TreeSet        ,             。         compareble  ,    compareTo  */
//        ,     
public class TreeSetDemo {
	
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();

		ts.add(new Student1("lisi0:",30));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi9:",29));
		ts.add(new Student1("lisi8:",38));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi4:",14));
		ts.add(new Student1("lisi7:",27));
		System.out.println(ts);

	}

}
//          
class Student1 implements Comparable{
	private String name;
	private int age;
	Student1(String name,int age){
		this.name=name;
		this.age=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 int compareTo(Object o) {
		Student1 stu=(Student1)o;
		int num=new Integer(this.age).compareTo(new Integer(stu.age));
		return num==0?this.name.compareTo(stu.name):num;
		/*Student stu=(Student)o;
		if(this.age>stu.age)
		return 1;
		if(this.age==stu.age)
			return 0;
		return 1;*/
	}
	
	public String toString() {
		return name+this.age;
	}
}

 
위의 TreeSetDemo 의 main 방법 이 실 행 된 결 과 는 다음 과 같 습 니 다.
[lisi4:14, lisi7:27, lisi9:29, lisixx:29, lisi0:30, lisi8:38]
이러한 종류의 compare To 방법 은 정렬 의 관건 을 결정 할 수 있 을 뿐만 아니 라 유일 성 을 확보 하 는 관건 이기 도 하 다. 
 
TreeSet 정렬 의 두 번 째 방법:
 
package cn.java.collection.set;

import java.util.Comparator;
import java.util.TreeSet;

/*
TreeSet:    Set               。
		          :          0.
		       :   。

		        :
			          。       java.lang.Comparable  ,  compareTo    。
			
			  ,            ,            ,      。
			  ,             ,            。          。
			      ?
		        :        。
			              。
			         java.util.Comparator  ,  compare  。  Comparator            
			   TreeSet      。

			        。
*/
public class TreeSetDemo3 {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet(new StudentComparatorByName());

		ts.add(new Student1("lisi0:",30));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi9:",29));
		ts.add(new Student1("lisi8:",38));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi4:",14));
		//ts.add(new Student(39));
		ts.add(new Student1("lisi7:",27));

		System.out.println(ts);
	}

}


/*
 *        ,  comparator
 */
class StudentComparatorByName implements Comparator{

	@Override
	public int compare(Student1 s1, Student1 s2) {
		Student1 stu=(Student1)s1;
		Student1 stu2=(Student1)s2;
		int num=stu.getName().compareTo(stu2.getName());
		return num==0?new Integer(stu.getAge()).compareTo(new Integer(stu2.getAge())):num;
	}
}
//          
class Student1 implements Comparable{
	private String name;
	private int age;

	Student1(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int compareTo(Object o) {
		Student1 stu=(Student1)o;
		if(this.age>stu.age)
		return 1;
		if(this.age==stu.age)
			return 0;
		return 1;
	}
	
	@Override
	public String toString() {
		return this.getName()+this.age;
	}
}

 TreeSet 정렬 의 두 번 째 방법 은 다음 과 같 습 니 다.
 
[lisi0:30, lisi4:14, lisi7:27, lisi8:38, lisi9:29, lisixx:29]

좋은 웹페이지 즐겨찾기