>  기사  >  Java  >  자바 컬렉션 객체 정렬

자바 컬렉션 객체 정렬

伊谢尔伦
伊谢尔伦원래의
2016-12-05 11:19:431755검색

1. 목록 정렬

이것은 배열 정렬과 다릅니다.

사실 Java에는 배열 및 목록 정렬 구현이 있습니다. 배열의 경우 Arrays.sort를 직접 사용할 수 있으며 목록 및 벡터의 경우 Collections.sort 메서드를 사용할 수 있습니다.

Java API는 컬렉션 유형을 정렬하는 두 가지 방법을 제공합니다.

java.util.Collections.sort(java.util.List)

java.util.Collections .sort( java.util.List, java.util.Comparator)

컬렉션의 요소가 모두 동일한 유형이고 Comparable 인터페이스를 구현하는 경우 첫 번째 메서드를 직접 호출할 수 있습니다.

예를 들어 자연 정렬을 따르지 않고 다른 정렬 아이디어가 있는 경우 역방향과 같은 비교기를 전달할 수도 있습니다.

다른 요소의 경우는 더 복잡하므로 지금은 무시해도 됩니다.


일반적으로 Player와 같은 새 클래스가 있고 이를 정렬하려는 경우 Comparable 인터페이스를 구현하고 CompareTo 메서드를 구현합니다. 예를 들어, 가장 작은 것부터 시작하여 연령별로 정렬하려면 다음을 구현할 수 있습니다.

public class Player implements Comparable<Player>{
       private String name;
       private int age;
       public Player(String name, int age){
          this.name=name;
          this.age=age;
       }
       public int getAge(){
          return age;
       }
       public void setAge(int age){
       this.age = age;
       }
       //实现接口方法,将来排序的时候sort看正负数还是零来进行判断大小 
       @Override
       public int compareTo(Player player){
             return this.getAge() - player.getAge();
       }
}

Comparable 인터페이스는 기본적으로 자연 순서로 정렬합니다. CompareTo 메서드를 반대로 구현해도 괜찮지만, 혼돈하지 않으면 다른 사람이 혼돈할 수 있으니 주의하세요. 모든 것이 합의된 대로 이루어지면 혼란이 생길 ​​가능성이 줄어듭니다. 따라서 자연 정렬이 만족스럽지 않거나 간단한 자연 정렬로는 원하는 정렬을 얻을 수 없을 때 실제로 Comparator를 사용합니다. 예를 들어 값의 절대값에 따라 정렬하려면 당연히 Comparable을 사용할 수 없습니다. Comparator 구현 클래스를 직접 작성하고, 비교 메서드를 구현하고, 원하는 방식에 따라 양수, 음수 또는 0 숫자를 반환해야 합니다.

Collections.reverseOrder(), String.CASE_INSENSITIVE_ORDER와 같은 일부 비교기가 시스템과 함께 제공됩니다.


2.세트 정렬

Java에는 자연 순서로 정렬된 Set에 대한 구현 클래스인 TreeSet이 있습니다. 내가 직접 정리하도록 하세요. 물론 TreeSet은 여러 생성자, 특히 Comparator 유형 매개변수를 받는 생성자를 제공하여 개발자가 자연 정렬에만 국한되지 않고 자신의 아이디어에 따라 정렬할 수 있도록 합니다.


또 다른 방법은 집합을 목록 개체에 직접 넣은 다음 정렬을 사용하는 것입니다.


3.지도 정렬

이것이 좀 더 번거롭습니다.

맵은 키-값 쌍이므로 키 또는 값으로 정렬할 수 있습니다. 보통 키는 같을 수 없지만 값은 같을 수 있기 때문에 정렬에는 많은 값이 사용됩니다. 먼저 예를 들어보겠습니다.

실제로는 결국 List로 변환하는 것이 더 편리하다는 것이 원칙입니다.

Map을 탐색할 때 Map.Entry라는 것을 사용해야 합니다. Map 개체 맵이 있는 경우 map.entrySet()을 사용하여 Map.Entry로 채워진 집합 개체를 가져올 수 있습니다. . , 반복하려는 경우 간단히 iterator를 사용하여 내부의 모든 요소를 ​​가져올 수 있습니다. 정렬하려면 이 세트를 목록에 넣은 다음 Comparator 개체를 정의하고 여기에 비교 메서드를 구현한 다음 선수 점수 차이와 같은 차이를 반환한 다음 Collections.sort를 사용하는 것이 가장 좋습니다. 메서드를 사용하여 목록 개체와 비교기 개체를 전달하면 정렬이 완료됩니다.

예를 들어보세요

public class MapSort{
    public static void main(String[] args){
         Map<String, Player> map = new HashMap<String, Player>();
         Player p1 = new Player("John", 1000);
         Player p2 = new Player("Ben", 3000);
         Player p3 = new Player("Jack", 2000);
         map.put(p1);
         map.put(p2);
         map.put(p3);
         //将Map里面的所以元素取出来先变成一个set,然后将这个set装到一个list里面
         List<Map.Entry<String, Player>> list = new ArrayList<Map.Entry<String, Player>>(map.entrySet());
         //定义一个comparator
         Comparator<Map.Entry<String, Player>> comparator = new Comparator<Map.Entry<String, Player>>(){
                  @Override
                  public int compare(Entry<String, Player> p1, Entry<String, Player> p2){
                        //之所以使用减号,是想要按照分数从高到低来排列
                        return -(p1.getValue().score - p2.getValue().score);
                   }
         };
         Collections.sort(list, comparator);
         for(Map.Entry<String, Player> entry:list){
                 System.out.println(entry.getValue().name + ":" + entry.getValue().score);
          }
    }
}
class Player{
    String name;
    int score; 
    public Player(String name, int score){
        this.name == name;
        this.score == score;  
    }   
}

이렇게 정렬하면 마지막에 아래와 같은 내용이 출력됩니다


Ben :3000

Jack:2000

John:1000


요약하자면, 사실 모든 집합 정렬은 목록 정렬로 변환될 수 있습니다. 컬렉션 자체가 목록 정렬을 지원하기 때문입니다.

지도는 집합으로, 집합은 목록으로 전환할 수 있으므로 둘 다 목록으로 전환할 수 있습니다.

1. 가장 간단한 경우에는 정렬할 클래스가 Comparable 인터페이스를 구현한 후 비교 메소드를 구현하고 자연스럽게 뺄셈을 수행한 후 뺄셈 결과를 반환한 후 Collections.sort를 직접 사용합니다. (목록 목록) 방법이 가능합니다. 이러한 종류를 자연 정렬이라고 하며 원본 목록과 집합에만 적합합니다.

2. 자연 정렬을 사용하지 않으려면 문제 없습니다. Comparator 객체를 정의하고 거기에 논리를 구현한 다음 Collections.sort(List list, Comparator comparator)를 사용하십시오.

3. Map의 경우 조금 더 복잡하지만 원칙은 두 번째 경우입니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.