IT_Programming/Java

인터페이스 Comparator를 이용한 순서 정렬하기 (Array.sort)

JJun ™ 2007. 7. 5. 10:04
LONG

 

===============[StudentIDComparator.java: 아이디 순서대로 정렬]================

import java.util.Comparator;
public class StudentIDComparator implements Comparator{
 //싱글톤 디자인 패턴을 이용하자.
 private static StudentIDComparator lc
   =new StudentIDComparator();
 private  StudentIDComparator(){}
 public static StudentIDComparator getInstance(){
  return lc;
 }
 
//Comparator때문에 구현 할 메서드
 public int compare(Object o1, Object o2) {
     Student sid1  = ((Student)o1);
     Student sid2  = ((Student)o2);
     if(sid1.getId()>sid2.getId()){
   return 1;
//크다. //증가순
  }else if(sid1.getId()==sid2.getId()){
   return 0;
  }else{
   return -1;
  }
 }
 /*
 public int compare(Object o1, Object o2) {
     Student sid1  = (Student)o1;
     Student sid2  = (Student)o2;
     return sid1.compareTo(sid2);
 }*/
}

==========================================================================================

 

============================[StudentIDMain.java]=============================

import java.util.Arrays;
public class StudentIDMain {

 public static void main(String[] args) {

  StudentIDComparator idc=StudentIDComparator.getInstance();
  
//선언
  Student [] sg=new Student[7];
  //초기화
  sg[0]=new Student("김말뚝",101007,"서울");
  sg[1]=new Student("홍길동",101006,"경기");
  sg[2]=new Student("최순동",101003,"인천");
  sg[3]=new Student("이연림",101004,"부산");
  sg[4]=new Student("하하호",101005,"창원");
  sg[5]=new Student("김경민",101001,"목포");
  sg[6]=new Student("김소연",101002,"제주");
  
  System.out.println("id순 출력==============");
  Arrays.sort(sg,idc);
  prints(sg);
 }
 public static void prints(Student[] a){
  int num=a.length;
  for(int j=0;j<num;j++){
     System.out.println(a[j]);
    }
//for
    System.out.println();
 }
//prints
}

 

 

 

 

ARTICLE

==============================[Student.java]===============================

public class Student implements Cloneable{
 private String name;
 private int id;
 private String addr;
 
 public Student(String name, int id,String addr) {
  this.name=name;
  this.id=id;
  this.addr=addr;
 }
//Student
 public String getAddr() {return addr;}
 public int getId() {return id;}
 public String getName() {return name;}
 public void setAddr(String string) {addr = string;}
 public void setId(int i) {id = i;}
 public void setName(String string) {name = string;}
 public String toString(){
  return name+"   "+id+"    "+addr;
 }
//toString
 public Object clone(){
  try{
   return super.clone();
  }catch(CloneNotSupportedException e){
   return this;
  }
 }
//clone
 public boolean equals(Object obj){
  boolean isE=false;
  Student temp=(Student)obj;
  if(temp.getName().equals(name) && temp.getId()==id
   && temp.getAddr().equals(addr)){
   isE=true;
  }
  return isE;
 }
//equals
 public int hashCode(){
  int temp=0;
  temp=name.hashCode()+addr.hashCode()+id+37;
  return temp;
 }
//hashCode
}
==========================================================================================

 

===============[StudentLexiComparator.java: 이름 순서대로 정렬]================

1) import java.util.Comparator;

// Comparator는 java.util 패키지에 있다.

// Comparator에는 추상 메서드 compare과 equals가 선언되어 있다.

2) public class StudentLexiComparator implements Comparator{
//싱글톤 디자인 패턴을 이용하자. (오직 하나의 객체만 생성: 3~7줄)

// → 먼저 자신을 static 필드에 private로 선언 → 객체를 생성하는데 static 키워드 이용

// → 객체를 하나만 생성 그리고 private을 써서 외부에서 볼 수 없게 한다.

// (추상 메서드를 구현하지 못하면 이 클래스는 추상 클래스가 된다.)
3) private static StudentLexiComparator lc = new StudentLexiComparator();
4) private StudentLexiComparator(){}

   // 생성자의 접근 제한자가 private이므로 외부에서 new 키워드로 생성할 수 없다.
5) public static StudentLexiComparator getInstance(){

/*

    싱글톤 디자인 패턴은 생성자의 getInstance 메서드를 사용하여 이미 생성되어 있는 객체의

    레퍼런스를 얻는다. 3)줄에서 생성된 자신의 객체는 외부에서 접근할 수 없는 private이므로

    public 메서드를 이용하여 접근한다. 또한 static으로 필드를 선언했으므로 static 필드를 얻으려면

    static 메서드를 이용해야 한다.

    따라서 getInstance()는 public static StudentLexiComparator getInstance()가 된다.

*/
6) return lc;
7) }
 //Comparator때문에 구현 할 메서드
8) public int compare(Object o1, Object o2) {

/*

   Comparator에는 추상 메서드 compare와 equals가 선언되어 있으므로 이 둘을 구현해야 한다.

   그런데 public class StudentLexiComparator extends Object implements Comparator와 같이

   extends 키워드를 명시하지 않는 모든 클래스는 Object를 자동으로 상속한다.

   equals 메서드는 Object에 구현되어 있는 메서드로, 특별한 경우에만 오버라이딩 한다.

   보통 compare만 구현하는데 compare의 리턴값이 1이면 앞이 뒤보다 작고, 0이면 같고,

   -1이면 앞이 뒤보다 크다.

*/
9)   String sc1 = ((Student)o1).getName();
// compare로 바교하여 Student라면 Student로 캐스팅함
10)  String sc2 = ((Student)o2).getName();
11)  return sc1.compareTo(sc2);

/*

   이름 순서대로 정렬하려고 Student의 getName() 메서드를 이용하여 이름을 얻고, 문자를 비교하려고

   문자열 비교 메서드 compareTo() 메서드를 이용한다. compareTo는 String에 있는 메서드로 1이면

   알파벳 순서대로, -1이면 알파벳 반대 순서로 나타낸다.

*/
12) } // equals를 구현하지 않으면 Object equals 사용
 
//toString은 구현 안하면 Object toString사용
}

===========================================================================================

 

 

===========================[StudentLexiMain.java]============================

import java.util.Arrays; // java.util 패키지의 Arrays 이용 - 알파벳 순서대로의 Student 정렬을 위해서
public class StudentLexiMain {

 public static void main(String[] args) {

  StudentLexiComparator lc=
      StudentLexiComparator.getInstance();
  StudentIDComparator idc=StudentIDComparator.getInstance();
  // 싱글톤 패턴은 new 키워드를 이용하여 객체를 생성하지 않는다.

  // 이미 자신 내에서 생성된 객체의 레퍼런스를 얻으려고 getInstance() 메서드를 사용한다.

  // getInstance() 메서드는 static이므로 StudentLexiComparator.getInstance();를 호출한다.

  // 싱글톤 패턴은 한 클래스에서 객체 하나만 생성할 때 사용하는 방법이다.
  Student [] sg=new Student[7]; // 선언
  //초기화

  // 기본 타입의 배열 정의는 자동 초기화됨 but  참조타입의 배열 정의는 자동으로 초기화 되지 않음

  // 그러므로 반드시 new를 이용하여 객체를 생성하면서 초기화해야 한다.
  sg[0]=new Student("김말뚝",101001,"서울");
  sg[1]=new Student("홍길동",101002,"경기");
  sg[2]=new Student("최순동",101003,"인천");
  sg[3]=new Student("이연림",101004,"부산");
  sg[4]=new Student("하하호",101005,"창원");
  sg[5]=new Student("김경민",101006,"목포");
  sg[6]=new Student("김소연",101007,"제주");
  
  System.out.println("이름순 출력==============");
  Arrays.sort(sg,lc); // Student 배열을 이름 순서대로 정렬하기 위해서
          
  prints(sg);            // sg = Student 배열, lc = 이름 정렬을 위한 StudentLexiComparator

  System.out.println("id순 출력==============");
  Arrays.sort(sg,idc);
  prints(sg);
 }
 public static void prints(Student[] a){
  int num=a.length;
  for(int j=0;j<num;j++){
     System.out.println(a[j]);
    }//for
    System.out.println();
 }
//prints
}
==========================================================================================

 

 

 

'IT_Programming > Java' 카테고리의 다른 글

Collection 클래스  (0) 2007.07.05
Comparable 인터페이스  (0) 2007.07.05
자바 컬렉션 프레임워크 [JCF]  (0) 2007.07.02
클론을 이용한 참조 타입의 복사본 만들기  (0) 2007.06.29
추상 클래스와 인터페이스  (0) 2007.06.29