Java에서 Comparable 및 Comparator 객체 비교

정렬이 필요한 집합이나 그룹이 단순한 숫자형이 아닐 때, 일반적으로Comparator나Comparable를 사용하여 간단한 방식으로 대상의 정렬이나 사용자 정의 정렬을 실현할 수 있다.
A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order. Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don't have a natural ordering. ------API
문자열 목록을 직접sort로 정렬할 수 있습니다. 그것은 String이라는 대상이 Comparable 인터페이스를 실현했기 때문에 우리의Person이 정렬을 하려면 비교기를 실현해야 합니다.
하나.Comparator
Linkedlist에 저장된 객체 정렬

import java.util.Comparator;
import java.util.LinkedList;
class Person{
  private float height;
  private String name;
  
  Person(float height)
  {
    this.height=height;
  }
  public float getHeight() {
    return height;
  }
  public void setHeight(float height) {
    this.height = height;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
class PersonHeight implements Comparator<Person>{
   
  @Override
  // compare ,return<0 ,return>0 ( )
  public int compare(Person e1, Person e2) {
    if(e1.getHeight() < e2.getHeight()){
      return 1;
    } else {
      return -1;
    }
  }
}
public class Question3 {
  public static void main(String[] args) {
    Person p1=new Person(23.4f);
    p1.setName("Stud1");
    Person p2=new Person(2.34f);
    p2.setName("Stud2");
    Person p3=new Person(34.32f);
    p3.setName("Stud3");
    Person p4=new Person(56.45f);
    p4.setName("Stud4");
    Person p5=new Person(21.4f);
    p5.setName("Stud5");
    
    LinkedList<Person> al=new LinkedList<Person>();
    al.add(p1);
    al.add(p2);
    al.add(p3);
    al.add(p4);
    al.add(p5);
    
        // sort , 
    Collections.sort(al, new PersonHeight());
    
        // 
    for(Person p:al)
      System.out.println(p.getName());
  }
}
추가:

// 
/**
 *  o1 o2, ; o1 o2, ; , 0;
 */
@Override
public int compare(Step o1, Step o2) {
  Date acceptTime1=UtilTool.strToDate(o1.getAcceptTime(), null);
  Date acceptTime2=UtilTool.strToDate(o2.getAcceptTime(), null);
  
  // , before 
  if(acceptTime1.after(acceptTime2)) return 1;
  return -1;
}
2.Comparable

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
class Person implements Comparable{
  private float height;
  private String name;
  
  Person(float height)
  {
    this.height=height;
  }
  public float getHeight() {
    return height;
  }
  public void setHeight(float height) {
    this.height = height;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
  public int compareTo(Object o) {
    // TODO Auto-generated method stub
    if(this.height>((Person)o).height){
      return 1;
    }else
    return -1;
  }
  
}
public class Question3 {
  public static void main(String[] args) {
    Person p1=new Person(23.4f);
    p1.setName("Stud1");
    Person p2=new Person(2.34f);
    p2.setName("Stud2");
    Person p3=new Person(34.32f);
    p3.setName("Stud3");
    Person p4=new Person(56.45f);
    p4.setName("Stud4");
    Person p5=new Person(21.4f);
    p5.setName("Stud5");
    
    LinkedList<Person> al=new LinkedList<Person>();
    al.add(p1);
    al.add(p2);
    al.add(p3);
    al.add(p4);
    al.add(p5);
    
    Collections.sort(al);
    
    for(Person p:al)
      System.out.println(p.getName());
  }
}
셋.비교하다
Comparable은 Person 클래스의 내부에 정의됩니다.
Comparator는 Person의 외부에 정의되어 있으며, 이때 우리의 Person 클래스의 구조는 아무런 변화가 필요하지 않습니다.
두 가지 방법은 각각 우열이 있다. Comparable로 간단하다. Comparable 인터페이스를 실현하는 대상은 바로 비교할 수 있는 대상이 된다. 그러나 원본 코드를 수정해야 한다. Comparator의 장점은 원본 코드를 수정할 필요가 없고 다른 비교기를 실현하는 것이다. 어떤 사용자 정의 대상이 비교를 해야 할 때 비교기와 대상을 함께 전달하면 크기를 비교할 수 있다.또한Comparator에서 사용자는 복잡하고 통용될 수 있는 논리를 스스로 실현하여 비교적 간단한 대상과 일치하게 할 수 있다. 그러면 많은 중복 노동을 절약할 수 있다.

좋은 웹페이지 즐겨찾기