집합 프레임 워 크 (4) - Collection 부분 집합 - Set 과 그의 동생 들!

5280 단어
Set: 집합: 중의 방법 은 Collection 과 일치 합 니 다. 하위 클래스 대상 에 주의 하면 됩 니 다.원 소 를 꺼 내 면 교체 기 만 사용 할 수 있다.
    HashSet 
    TreeSet
HashSet - 바 텀 데이터 구 조 는 해시 표 로 순 서 를 보장 하지 않 고 동기 화 되 지 않 습 니 다.
해시 표: 요소 의 자체 특징 에 따라 어떤 위치 에 저장 해 야 하 는 지 확인 합 니 다.
위 치 는 어떻게 정 하 죠?해시 알고리즘.
해시 표 의 유래: 조회 속 도 를 높 인 다.
[해시 표 는 저 장 된 요소 의 유일 성 을 어떻게 보장 합 니까?]
해시 표 가 똑 같이 충돌 할 때 두 요소 의 위치 가 같다 는 것 을 설명 하고 두 요소 의 내용 을 다시 비교 합 니 다.equals 로 내용 의 비 교 를 완성 하 다.
equals 가 true 로 돌아 오 면 같은 요소 로 보고 저장 하지 않 습 니 다.false 로 되 돌아 가면 서로 다른 요소 로 저장 합 니 다.
 
[해시 값 과 메모리 주소 의 차이]
해시 값 은 해시 알고리즘 을 통 해 계 산 된 저장 위치 입 니 다. 해시 값 이 같 으 면 equals 를 판단 합 니 다. 그렇지 않 으 면 저장 하지 않 습 니 다.
메모리 주소: 메모리 의 실제 주소 입 니 다.
[어떻게 해시 표 에 사용자 정의 대상 을 저장 합 니까?]
hashCode 방법 과 equals 방법 을 덮어 써 야 합 니 다.
[이 대상 이 도대체 그 용기 에 저장 되 어 있 는 지 모 를 때 어떻게 해 야 하나 요?]
hashCode, equals, toString 을 모두 덮어 씁 니 다.덮어 쓰 지 않 아 도 Object 에서 물 려 받 습 니 다.
 
HashSetDemo.java
 
【TreeSet】
Set 집합 에 있 는 요 소 를 지정 한 방식 으로 정렬 할 수 있 습 니 다. 기본적으로 자연 순 서 를 사용 합 니 다.
[자연 순서 란 무엇 인가!]
TreeSet 정렬 방법 1: 자연 정렬
요소 자체 가 갖 춘 비교 성 은 Comparable 인터페이스의 compare To 방법 을 실현 했다.
[연습] TreeSetDemo. java
package day0916;

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

public class TreeSetDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet ts = new TreeSet();
		
		ts.add("xixi");
		ts.add("jfkk");
		ts.add("jdfiew");
		ts.add("xnncixi");
		ts.add("wejkllkxi");
		ts.add("iiweu");
		
		for(Iterator it =ts.iterator(); it.hasNext();){
			System.out.println(it.next());
		}

	}

}

 
 
TreeSet 정렬 방법 2: TreeSetTest. java 비교 기 정렬
원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 춘 비교 성 (자연 순서) 이 필요 하지 않다 면.이 럴 때 는 두 번 째 방법 만 쓸 수 있다.
용기 자체 가 비교 성 을 갖 도록 하 다.용기 가 초기 화 되 자마자 비교 기능 을 갖 추 었 다.용 기 는 대상 구조 때 완성 되 기 때문이다.트 리 셋 (Comparator) 을 통 해 용기 초기 화 시 비교 기 를 지정 할 수 있 습 니 다.Comparator 인 터 페 이 스 를 실현 하고 compare 방법 을 덮어 쓰 면 됩 니 다.그래서 이런 방식 은 비교 기 정렬 이 된다.
[연습] - TreeSetTest. java
package cn.itcast.api.p1.set.demo;

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

import cn.itcast.api.p2.comparator.ComparatorByName;
import cn.itcast.bean.Person;

public class TreeSetDemo {

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

		/*
		 * TreeSet:                ,       。
		 * 	    :                Comparable   compareTo  
		 * 
		 * 
		 */
		TreeSet ts = new TreeSet(new ComparatorByName());//     。
		
		ts.add(new Person("lisi1",20));
		ts.add(new Person("lisi7",28));
		ts.add(new Person("lisi9",22));
		ts.add(new Person("lisi3",21));
		ts.add(new Person("lisi5",26));
		
		Iterator it = ts.iterator(); //       TreeSet      
		
		while(it.hasNext()){
			System.out.println(it.next().toString());
		}
		
	}
}

package cn.itcast.api.p2.comparator;

import java.util.Comparator;

import cn.itcast.bean.Person;

/**
 *        Person Name        。 
 * @author Administrator
 *
 */
public class ComparatorByName extends Object implements Comparator {

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

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

}



package cn.itcast.bean;

/*
 *    Person           。
 *     person         。
 *  Person   Comparable  。 Person      。   compareTo  。 
 * 
 */
public class Person implements Comparable {

	private String name;
	private int age;
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	/**
	 *   Object   hashCode  。  Person            。
	 */
	public int hashCode(){
		final int NUMBER = 27;
		
		return name.hashCode() + age*NUMBER;//*27            。
	}
	/**
	 *   Object   equals  ,  Person  。
	 *          。   Person        。
	 */
	public boolean equals(Object obj){
		
		if(!(obj instanceof Person))
			return false;
		
		Person p = (Person)obj;
		
		return this.name.equals(p.name) && this.age == p.age;
	}
	
	
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the age
	 */
	public int getAge() {
		return age;
	}
	/**
	 * @param age the age to set
	 */
	public void setAge(int age) {
		this.age = age;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		
		return name+":"+age;
	}
	@Override
	public int compareTo(Object o) {
		
		/*
		 *   Person         。    。
		 */
		
		/*
		 *          ,  ,       ,        ,       。
		 *             ,      ,       。
		 */
		//    。
//		Person p = (Person)o;
//		if(this.age>p.age)
//			return 1;
//		if(this.age==p.age)
//			return this.name.compareTo(p.name);
//		return -1;
		
		
		//     。
		Person p = (Person)o;
		int temp = this.age - p.age;
		
		return temp==0?this.name.compareTo(p.name):temp;
	}
	
}

[대상 비교 시]
일반적으로 주요 조건 을 먼저 비교 하고, 주요 조건 이 같 으 면 부차적인 조건 을 비교한다.

좋은 웹페이지 즐겨찾기