자바 저장 대상 을 실현 하고 대상 의 특정한 속성 에 따라 정렬 하 는 몇 가지 방법 예제

본 고 는 자바 가 저장 대상 을 실현 하고 대상 의 특정한 속성 에 따라 정렬 하 는 몇 가지 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
프로 그래 밍 을 할 때 특정한 대상 에 대해 특정한 속성 에 따라 사용자 정의 정렬 을 하 는 경우 가 많다.예 를 들 어 학생 대상 은 age 크기 에 따라 정렬 된다.
age 를 따로 꺼 내 서 순 서 를 정 한 다음 ages 배열 순 으로 students 를 다시 저장 하 는 방법 이 있다.그런데 너무 번 거 로 워 요.더 좋 은 방법 이 없 을까요?
있다~
첫 번 째,추가 하면 서 정렬 할 수 있 습 니 다.TreeSet 를 사용 해 야 합 니 다.
두 번 째 는 배열 로 대상 들 을 저장 하지만 특정한 속성 을 따로 꺼 내 다시 저장 하지 않 고 원래 배열 에서 비교 기 를 사용 하여 순 서 를 다시 배열 합 니 다.Arrays.sort(arr,comparator)를 사용 해 야 합 니 다.
세 번 째 는 집합 류 중의 list 의 하위 클래스 로 대상 들 을 저장 한 다음 정렬 합 니 다.Collections.sort(list,comparator)를 사용 해 야 합 니 다.
다음은 각각 토론 한다.
1.TreeSet
생 성:
번호
구조 함수 의 설명
1
TreeSet ()
이 구조 함수 구조 빈 트 리 집합 은 요소 의 자연 순서에 따라 오름차 순 으로 정렬 됩 니 다.
2
TreeSet(집합 c)
이 구조 함 수 는 트 리 의 집합 을 생 성 합 니 다.요소 의 집합 c 를 포함 합 니 다.
3
TreeSet(비교 기 comp)
이 구조 함 수 는 빈 트 리 집합 을 구성 하여 주어진 비교 기 에 따라 정렬 합 니 다.
 
 
증가:boolean add(E e)지정 한 요 소 를 이 세트 에 추가 합 니 다.존재 하지 않 는 다 면.boolean addAll(Collection<? extends E> c)이 그룹 이 지정 한 집합 에 추 가 된 모든 요 소 를 추가 합 니 다.
삭제:boolean remove(Object o)이 그룹 에서 지정 한 요 소 를 제거 합 니 다.존재 한다 면.void clear()이 그룹 에서 모든 요 소 를 제거 합 니 다.
검사:Comparator<? super E> comparator()이 집합 에서 정렬 하거나 빈 요 소 를 되 돌려 줍 니 다.이 세트 를 사용 하면 원 소 를 자 연 스 럽 게 정렬 하 는 비교 입 니 다.boolean contains(Object o)이 집합 에 지정 한 요 소 를 포함 하면 되 돌려 줍 니 다true 。
 
 boolean isEmpty()이 집합 에 요소 가 포함 되 어 있 지 않 으 면 되 돌려 줍 니 다true 。Iterator<E> iterator()교체 기 에서 오름차 순 으로 정렬 된 요 소 를 되 돌려 줍 니 다.
 
   int size()이 세트(기수)에서 돌아 오 는 요소 의 수 입 니 다.  
옮 겨 다 니 기:교체 기 를 통 해 옮 겨 다 니 기.

Iterator it=treeset.iterator();
while(it.hasNext()){
 //      。
}

코드 구현:
TreeSet 은 질서 있 는 집합 으로 TreeSet 의 요 소 는 오름차 순 으로 배 열 됩 니 다.
 TreeSet 에서 대상 을 저장 할 때 정렬 할 수 있 습 니 다.그 중에서 Integer 는 기본 정렬 방법 이 있 고 String 은 기본 정렬 방법 이 있 으 며 사용자 정의 클래스 대상 이 저장 할 때 순서 가 없 으 므 로 사용자 정의 정렬 알고리즘 이 필요 합 니 다.
사용자 정의 클래스 의 대상 을 TreeSet 에 저장 하여 정렬 하거나 int,String 대상 에 게 자신의 정렬 방법 을 정의 하려 면 다음 과 같은 두 가지 방법 이 있 습 니 다.
        정렬 의 첫 번 째 방법:
           원소 자체 가 비교 성 을 갖 도록 하 다.요 소 를 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 덮어 쓰 며 방법 내 에서 비교 알고리즘 을 정의 하고 크기 관계 에 따라 양수 음수 나 0 을 되 돌려 줍 니 다.TreeSet 저장 대상 을 사용 할 때 add()방법 내 부 는 compare To()방법 을 자동 으로 호출 하여 비교 하고 비교 결과 에 따라 이 진 트 리 형식 으로 저장 합 니 다.
       정렬 의 두 번 째 방법:
       사용자 정의 비교 기. Comparator 인 터 페 이 스 를 구현 하고 compare 를 덮어 쓰 는 방법 을 정의 합 니 다.이 Comparator 인터페이스 하위 클래스 대상 을 TreeSet 집합 구조 함수 에 전달 합 니 다.
첫 번 째:클래스 정의 시 Comparable 인 터 페 이 스 를 실현 하고 자신의 비교 알고리즘 을 정의 합 니 다.
Person 클래스 의 경우 이름과 나 이 를 대상 속성 으로 treeset 에 저장 하고 나이 의 상승/하락 순 으로 저장 합 니 다.

public class TreeSetTest {

public static void main(String[] args) {
TreeSet people=new TreeSet();
people.add(new Person("  ", 20));
people.add(new Person("  ", 30));
people.add(new Person("  ", 18));
people.add(new Person("  ", 17));
people.add(new Person("  ", 35));

Iterator it=people.iterator();
while(it.hasNext()){
  System.out.println(it.next());
  }
}

}
class Person implements Comparable{  //    ,      

String name;
int age;

public Person() {
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String toString(){
return "  :"+name+",  :"+age;
}
/*
compareTo(Object o):                 ,                。
       ,        :  1,     ,               ;
  0,                 ,                     ;
  -1,            ,      ;
*/
public int compareTo(Object o) {
Person curr=(Person) o;
//int result = this.age<curr.age?1:(this.age==curr.age?0:-1);//    :                  ,    1,        
int result = this.age>curr.age?1:(this.age==curr.age?0:-1);//    :                  ,    1,        
if(result==0){
result=this.name.compareTo(curr.name);//age   ,           。    ,int、string           ,        
}
return result;
} 
}

 
두 번 째:Comparator 인터페이스의 실현 클래스(비교 기)를 정의 하고 클래스 에서 대상 을 정의 하 는 비교 알고리즘 입 니 다.Treeset 을 만 들 때 비교 기 대상 을 전달 합 니 다.

public class TreeSetTest {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
TreeSet people=new TreeSet(new MyComparator());//        TreeSet       
people.add(new Person("  ", 20));
people.add(new Person("  ", 30));
people.add(new Person("  ", 18));
people.add(new Person("  ", 17));
people.add(new Person("  ", 35));

Iterator it=people.iterator();//      treeset
while(it.hasNext()){
System.out.println(it.next());
}
}

}
class Person {

String name;
int age;

public Person() {
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String toString(){
return "  :"+name+",  :"+age;
}

}
class MyComparator implements Comparator{//  Comparator  ,      ,  compare        

/*
compare(o1,o2):  o1       ,o2               ,      。
       ,        :  1,     ,               ;
  0,                 ,                     ;
  -1,            ,      ;

*/
public int compare(Object o1, Object o2) {
Person p1=(Person)o1;
Person p2=(Person)o2;

int result=p1.age<p2.age?1:(p1.age==p2.age?0:-1);//    
//int result=p1.age<p2.age?1:(p1.age==p2.age?0:-1);//    

if(result==0){
result=p1.name.compareTo(p2.name);
}
return result;
}

}
2.배열 로 대상 을 저장 하고 비교 기 를 이용 하여 sort()정렬 방법 을 변경 합 니 다.
배열 자체 에 기본 정렬 방법 이 있 습 니 다.int,string 등 기본 유형 에 대해 기본 sort()방법 이 있 습 니 다.클래스 대상 에 대한 정렬 은 sort()방법 에 비교 기 대상 을 전송 하여 정렬 알고리즘 을 부여 할 수 있 습 니 다.

public class ArraysTest {

public static void main(String[] args) {

Person[] people=new Person[5];
people[0]=(new Person("  ", 20));
people[1]=(new Person("  ", 30));
people[2]=(new Person("  ", 18));
people[3]=(new Person("  ", 17));
people[4]=(new Person("  ", 35));

Arrays.sort(people,new MyCompare());//          ,               
for(Person i:people){
System.out.println(i);
}

}

}
class Person {

String name;
int age;

public Person() {
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String toString(){
return "  :"+name+",  :"+age;
}

}

class MyCompare implements Comparator<Person>{//     

/*

      compare(o1,o2):

         ,             ,    int。

int>0, o1  o2  ;

int<0, o1  o2  ;

int=0,        ,      o1、o2       。

*/
public int compare(Person o1, Person o2) {
int result;
if(o1.age>o2.age){
result=1;
}
else if(o1.age<o2.age){
result=-1;
}
else{
result=0;
}
return result;
}

}
 세 번 째:list 의 하위 클래스:Vector,Array List 로 대상 을 저장 하고 Collections.sort(list,comparator)방법 으로 정렬 합 니 다.

public class CollectionsTest {

public static void main(String[] args) {
Vector<Person> people=new Vector<>();//       

//ArrayList<Person> people=new ArrayList<>():// ArrayList    。
people.add(new Person("  ", 20));
people.add(new Person("  ", 30));
people.add(new Person("  ", 18));
people.add(new Person("  ", 17));
people.add(new Person("  ", 35));
Collections.sort(people,new MyComparator());//        
Iterator it=people.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}

}
class Person {

String name;
int age;

public Person() {
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String toString(){
return "  :"+name+",  :"+age;
}

}
class MyComparator implements Comparator<Person>{//  Comparator  ,      ,  compare        

/*
compare(o1,o2):        ,         ,    int 。
int>0,o1  o2 ;
int<0,o1  o2 ;
int=0,            。

*/
public int compare(Person p1, Person p2) {
int result=p1.age<p2.age?1:(p1.age==p2.age?0:-1);//    
//int result=p1.age<p2.age?1:(p1.age==p2.age?0:-1);//    

if(result==0){
result=p1.name.compareTo(p2.name);
}
return result;
}

}

 
자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기