면접 필수 항목 의 Set 구현 클래스:TreeSet

11092 단어 SetTreeSet
1.TreeSet 개요
1.TreeSet 은 SortedSet 인터페이스의 실현 클래스 로 TreeSet 은 집합 요소 가 정렬 상태 에 있 는 지 확인 할 수 있 습 니 다.
2.TreeSet 은 말 그대로 그 가 내부 에서 유지 하 는 것 은 TreeMap 이 고 밑바닥 은 빨간색 과 검은색 두 갈래 나무 이 며 그 는 집합 안에 질서 있 는 서열 을 가진다.
3.Tree 는 추 가 된 대상 의 지정 한 속성 에 따라 정렬 할 수 있 기 때문에 TreeSet 에 추 가 된 데 이 터 는 같은 유형의 대상 이 어야 합 니 다.
4.두 가지 정렬 방식:자연 정렬(Comparable 인터페이스 실현)과 맞 춤 형 정렬(Comparator);
5.자연 정렬 에서 두 대상 이 같은 지 비교 하 는 기준 은 copare To()가 0 으로 되 돌아 가 는 것 입 니 다.더 이상 equals()가 아 닙 니 다.
6.맞 춤 형 정렬 에서 두 대상 이 같은 기준 인지 비교 하 는 것 은 copare()가 0 으로 돌아 가 는 것 입 니 다.더 이상 equals()가 아 닙 니 다.
7.TreeSet 를 옮 겨 다 닐 때 기본 값 은 자연 정렬 규칙 으로 정렬 합 니 다.
8.TreeSet 에서 사용자 정의 클래스 의 대상 을 추가 할 때 자 연 스 러 운 정렬 이나 맞 춤 형 정렬 이 있어 야 합 니 다.그렇지 않 으 면 이상 을 던 집 니 다:cannot cast to java.lang.Comparable;
2.TreeSet 구조
1,TreeSet 성명

1 public class TreeSet<E> extends AbstractSet<E>
2     implements NavigableSet<E>, Cloneable, java.io.Serializable
2.TreeSet 류 계승 구조

3.검 붉 은 나무
TreeSet과 뒤에 필요 한TreeMap은 붉 은 검 은 나무의 저장 구 조 를 사용한다.
특징:순서,검색 속도 가 List 보다 빠르다.
3.TreeSet 생 성
1.구조 기
TreeSet 은 빨간색 과 검은색 나무 구 조 를 바탕 으로 이 루어 진 것 으로 요 소 를 정렬 할 것 입 니 다.TreeSet 은 다섯 가지 구조 기 를 제공 합 니 다.

public TreeSet() {
    this(new TreeMap<E,Object>());
}
TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}
public TreeSet(SortedSet<E> s) {
    this(s.comparator());
    addAll(s);
}
안의 m 속성 은 무엇 입 니까:

/**
     * The backing map.
     */
    private transient NavigableMap<E,Object> m;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
    //  Java      :593142328      
안에 NavigableMap 을 유지 하고 있 는 것 을 볼 수 있 습 니 다.
2.Comparator 인 스 턴 스 를 통 해 TreeSet 만 들 기
위의 네 개의 구조 함수 중 세 번 째 를 중요 하 게 소개 하고 있 습 니 다.Comparator인 스 턴 스 를 통 해TreeMap를 만 듭 니 다.그러면Comparator은 도대체 어떤 신성 한 것 입 니까?
읽 기Comparator의 소스 코드 를 통 해 이것 은 집합 류 정렬 에 사용 되 는 보조 인터페이스 로 사용 자 는 copare 방법 을 실현 해 야 한 다 는 것 을 발견 했다.
만약 에 사용자 가 이런 방식 으로TreeSet를 만 들 었 다 면 집합 요 소 는 추가 로 처리 할 필요 가 없다.그렇지 않 으 면 집합 요 소 는 모두Comparable인 터 페 이 스 를 실현 해 야 한다.트 리 는 정렬 할 때compare또는compareTo방법TreeMap을 호출 하기 때문이다.
다음은 쓴 샘플 코드 를 살 펴 보 겠 습 니 다.

public class MyComparator implements Comparator<Person> {
        @Override
        public int compare(Person o1, Person o2) {
            return o1.age - o2.age;
        }
    }
public class Person {
    public Integer age;
    public Person(Integer value) {
        this.age = value;
    }
}
public static void TreeSetTest() {
    // TreeMap   put            Comparator  ,    ,                 compare  。
    TreeSet<Person> set = new TreeSet<Person>(new MyComparator());
    Person p1 = new Person(1);
    Person p2 = new Person(1);
    Person p3 = new Person(5);
    Person p4 = new Person(9);
    Person p5 = new Person(10);
    set.add(p1);
    set.add(p2);
    set.add(p3);
    set.add(p4);
    set.add(p5);
    Iterator<Person> i = set.iterator();
    while (i.hasNext()) {
        Person p = (Person) i.next();
        System.out.println(p.age);
    }//  Java      :593142328      
}
인쇄 결과:
1 5 9 10
4.TreeSet 방법

5.NavigableSet 인터페이스 소개
상용 방법:

//                 
public E lower(E e) {
    return m.lowerKey(e);
}
//                  
public E floor(E e) {
    return m.floorKey(e);
}
//                  
public E ceiling(E e) {
    return m.ceilingKey(e);
}//  Java      :593142328      
//                
public E higher(E e) {
    return m.higherKey(e);
}
6.TreeSet 와 비교 기
1.자연 정렬
(1)자연 정렬:TreeSet 은 집합 요소 의 compare To(Object obj)방법 으로 요소 간 의 크기 관 계 를 비교 한 다음 집합 요 소 를 오름차 순(기본 상황)으로 배열 합 니 다.
(2)한 대상 을TreeSet에 추가 하려 면 이 대상 의 종 류 는 반드시Comparable인 터 페 이 스 를 실현 해 야 한다.      
실현Comparable 의 유형 은 반드시 실현compareTo(Object obj)방법 을 실현 해 야 한다.두 대상 은compareTo(Object obj)방법의 반환 치 를 통 해 크기 를 비교 해 야 한다.
(3)Comparable의 전형 적 인 실현:
  • ① BigDecimal,BigInteger 와 모든 수치 형 에 대응 하 는 포장 류:해당 하 는 수치 크기 에 따라 비교 합 니 다.
  • ② Character:문자 의 유 니 코드 값 에 따라 비교 합 니 다.
  • ③ Boolean:true 에 대응 하 는 포장 류 인 스 턴 스 는 false 에 대응 하 는 포장 류 인 스 턴 스 보다 크다.
  • ④ String:문자열 에 있 는 문자 의 유 니 코드 값 을 비교
  • ⑤ Date,Time:뒤의 시간,날짜 가 앞의 시간,날짜 보다 크다
  • (4)TreeSet 에 요 소 를 추가 할 때 첫 번 째 요소 만 비교 할 필요 가 없다compareTo()방법,뒤에 추 가 된 모든 요 소 는 호출compareTo()방법 으로 비교 합 니 다.
    (5)같은 종류의 두 개의 인 스 턴 스 만 크기 를 비교 하기 때문에 TreeSet 에 같은 종류의 대상 을 추가 해 야 합 니 다.
    (6)TreeSet 집합 에 있어 서 두 대상 이 같은 지 판단 하 는 유일한 기준 은 두 대상 이 compare To(Object obj)방법 으로 반환 값 을 비교 하 는 것 이다.
    (7)대상 을 TreeSet 에 넣 고 해당 대상 에 대응 하 는 equals()방법 을 다시 써 야 할 때 이 방법 은 compare To(Object obj)방법 과 일치 하 는 결 과 를 확보 해 야 한다.만약 두 대상 이 equals()방법 으로 true 를 비교 하면 compare To(Object obj)방법 으로 0 을 되 돌려 야 한다.그렇지 않 으 면 이해 하기 어렵다.
    2.맞 춤 형 정렬
    (1)TreeSet 의 자연 정렬 은 요소 가 속 한 클래스 가 Comparable 인 터 페 이 스 를 실현 하도록 요구 합 니 다.만약 에 요소 가 속 한 클래스 가 Comparable 인 터 페 이 스 를 실현 하지 않 거나 오름차 순(기본 상황)방식 으로 요 소 를 배열 하지 않 거나 다른 속성 크기 에 따라 정렬 하 기 를 원 하지 않 으 면 맞 춤 형 정렬 을 고려 합 니 다.맞 춤 형 정렬 은 Comparator 인 터 페 이 스 를 통 해 이 루어 집 니 다.compare(T o1,T o2)방법 을 다시 써 야 합 니 다.
    (2)int compare(T o1,T o2)방법 을 이용 하여 o1 과 o2 의 크기 를 비교한다.만약 에 방법 이 정정 수 를 되 돌려 주면 o1 이 o2 보다 크다 는 것 을 나타 낸다.0 으로 돌아 가면 같다 는 뜻 이다.마이너스 정 수 를 되 돌려 주 는 것 은 o1 이 o2 보다 작 음 을 나타 낸다.[면접 자료
    (3)맞 춤 형 정렬 을 실현 하려 면 Comparator 인 터 페 이 스 를 실현 하 는 인 스 턴 스 를 트 리 셋 에 전달 하 는 구조 기 로 해 야 한다.
    (4)이때 도 TreeSet 에 같은 유형의 대상 만 추가 할 수 있 습 니 다.그렇지 않 으 면 ClassCastException 이상 이 발생 합 니 다.
    (5)맞 춤 형 정렬 을 사용 하여 두 요소 가 서로 같다 고 판단 하 는 기준 은 Comparator 를 통 해 두 요 소 를 비교 하여 0 으로 되 돌려 주 는 것 이다.
    사례
    1.사용자 정의 클래스 의 자연 정렬
    사례:
    
    public class User implements Comparable{
        private String name;
        private int age;
        public User() {
        }
        public User(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;
        }
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
        @Override
        public boolean equals(Object o) {
            System.out.println("User equals()....");
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            User user = (User) o;
            if (age != user.age) return false;
            return name != null ? name.equals(user.name) : user.name == null;
        }
        @Override
        public int hashCode() { //return name.hashCode() + age;
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + age;
            return result;
        }
        //          ,        
        @Override
        public int compareTo(Object o) {
            if(o instanceof User){
                User user = (User)o;
    //            return -this.name.compareTo(user.name);
                int compare = -this.name.compareTo(user.name);
                if(compare != 0){
                    return compare;
                }else{
                    return Integer.compare(this.age,user.age);
                }
            }else{//  Java      :593142328      
                throw new RuntimeException("        ");
            }
        }
    }
    
    TreeSet 로 저장:
    
    @Test
        public void test1(){
            TreeSet set = new TreeSet();
            set.add(new User("Tom",12));
            set.add(new User("Jerry",32));
            set.add(new User("Jim",2));
            set.add(new User("Mike",65));
            set.add(new User("Jack",33));
            set.add(new User("Jack",56));
    
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    
    주의:자연 비교 기 에서 나 이 를 비교 하지 않 으 면 이름 이 같 을 때 이 두 대상 이 같다 고 생각 하고 다시 저장 하지 않 습 니 다.
    비교 기 에서 두 속성 을 모두 비교 하면 하나의 속성 이 다 르 면 TreeSet 에 넣 습 니 다.
    여기 서 두 대상 에 대한 비 교 는 equals()방법 이 아니 라 비교 기 를 사용 하여 비교 한 것 임 을 알 수 있다.
    2.사용자 정의 클래스 의 맞 춤 형 정렬
    맞 춤 형 정렬:
    
    @Test
        public void test2(){
            Comparator com = new Comparator() {
                //          
                @Override
                public int compare(Object o1, Object o2) {
                    if(o1 instanceof User && o2 instanceof User){
                        User u1 = (User)o1;
                        User u2 = (User)o2;
                        return Integer.compare(u1.getAge(),u2.getAge());
                    }else{
                        throw new RuntimeException("          ");
                    }
                }
            };
            TreeSet set = new TreeSet(com);  //            
            set.add(new User("Tom",12));
            set.add(new User("Jerry",32));
            set.add(new User("Jim",2));
            set.add(new User("Mike",65));
            set.add(new User("Mary",33));
            set.add(new User("Jack",33));
            set.add(new User("Jack",56));
    
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    
    총결산
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기