TreeSet 정렬, 사용자 정의 대상 저장, 사용자 정의 비교 기 예제

4939 단어
Set: 순서 가 없 으 면 요 소 를 반복 할 수 없습니다. | --HashSet: 데이터 구 조 는 해시 표 입 니 다.스 레 드 는 동기 화 되 지 않 습 니 다.원소 의 유일 성 을 확보 하 는 원리: 원소 의 hashCode 값 이 같 는 지 판단 합 니 다.같 으 면 원소 의 equals 방법 이 true 인지 아 닌 지 계속 판단 합 니 다. | --TreeSet: Set 집합 에 있 는 요 소 를 정렬 할 수 있 습 니 다.바 텀 데이터 구 조 는 이 진 트 리 입 니 다.요소 의 유일 성 을 확보 하 는 근거: copare To 방법 return 0. TreeSet 정렬 의 첫 번 째 방식: 요소 자체 가 비교 성 을 가지 도록 합 니 다.요 소 는 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 덮어 써 야 합 니 다.요소 의 자연 순서 가 되 거나 기본 순서 라 고도 한다.TreeSet 의 두 번 째 정렬 방식 입 니 다.원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 추 는 비교 성 은 필요 하지 않다.이 럴 때 는 집합 자체 가 비교 성 을 갖 도록 해 야 한다.
집합 이 초기 화 되 었 을 때 비교 방식 이 생 겼 다.
예시: 수요: TreeSet 집합 에 사용자 정의 대상 학생 을 저장 하고 학생 의 나이 에 따라 순 서 를 매 깁 니 다.
package tan;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
	public static void main(String[] args) {
		TreeSet ts=new TreeSet();
				ts.add(new Student("tan1", 21));
				ts.add(new Student("tan3", 20));
				ts.add(new Student("tan2", 23));
				ts.add(new Student("tan5", 21));
				
				Iterator it=ts.iterator();
				while(it.hasNext()){
				System.out.println(it.next());
				}
	}
}
class Student implements Comparable{
	private String name;
	private Integer age;
	
	public Student(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 "name:"+this.name+" "+"age:"+this.age;
	}
	@Override
	public int compareTo(Object obj) {
		if(!(obj instanceof Student))throw new RuntimeException("     ");
		Student s=(Student)obj;
		if(this.age>s.age) return 1;
		//   ,        ,          。
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
}

사용자 정의 비교 기
package tan;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
	public static void main(String[] args) {
		//              
		TreeSet ts=new TreeSet(new StudentAgeComparator());
		
				ts.add(new Student("tan01", 21));
				ts.add(new Student("tan03", 20));
				ts.add(new Student("tan03", 22));
				ts.add(new Student("tan0012", 23));
				ts.add(new Student("tan007", 21));
				
				Iterator it=ts.iterator();
				while(it.hasNext()){
				System.out.println(it.next());
				}
	}
}
class Student implements Comparable{
	private String name;
	private Integer age;
	
	public Student(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 "name:"+this.name+" "+"age:"+this.age;
	}
	@Override
	public int compareTo(Object obj) {
		if(!(obj instanceof Student))throw new RuntimeException("     ");
		Student s=(Student)obj;
		if(this.age>s.age) return 1;
		//   ,        ,          。
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
}
//        
class StudentNameComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		int num=s1.getName().compareTo(s2.getName());
		if(num==0){
			//  Ingteger     comparable  
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
			//      
			/*
			if(s1.getAge()>s2.getAge())
				return 1;
			if(s1.getAge()==s2.getAge())
				return 0;
			return -1;
			*/
		}
		return num;
	}
	
}
//        
class StudentAgeComparator implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		int i=o1.getAge()-o2.getAge();
		return i;
	}	
}

연습: 문자열 길이 에 따라 정렬 합 니 다.
문자열 자체 가 비교 성 을 가지 고 있 지만 비교 방식 은 필요 하지 않 습 니 다. 이 때 는 비교 기 만 사용 할 수 있 습 니 다.
package tan;
import java.util.*;
public class TreeSetTest {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet(new StrLengthComparator());

		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("z");
		ts.add("hahaha");

		Iterator it = ts.iterator();

		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

class StrLengthComparator implements Comparator {
	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String) o1;
		String s2 = (String) o2;
		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		//        ,               
		if(num==0){
			return s1.compareTo(s2);
		}
		return num;
	}
}

좋은 웹페이지 즐겨찾기