면접 필수 항목 의 Set 구현 클래스: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
의 전형 적 인 실현: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());
}
}
총결산이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java의 Set, List, Map 사용법 및 차이점 소개맵 역시 모든 요소에 한 부를 저장하지만, 이것은'키'를 기반으로 하고, 맵에도 내장된 정렬이 있기 때문에 요소가 추가되는 순서에 관심이 없습니다.요소를 추가하는 순서가 중요하다면 LinkedHashSet 또는 Li...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.