Heim >Java >javaLernprogramm >Sortierung von Java-Sammlungsobjekten

Sortierung von Java-Sammlungsobjekten

伊谢尔伦
伊谢尔伦Original
2016-12-05 11:19:431772Durchsuche

1. Listensortierung

Dies unterscheidet sich von der Sortierung von Arrays.

Tatsächlich verfügt Java über Implementierungen zum Sortieren von Arrays und Listen. Für Arrays können Sie Arrays.sort direkt verwenden. Für Listen und Vektoren können Sie die Methode Collections.sort verwenden.

Java API bietet zwei Methoden zum Sortieren von Sammlungstypen:

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

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

Wenn die Elemente in der Sammlung alle vom gleichen Typ sind und die Comparable-Schnittstelle implementieren, können Sie die erste Methode direkt aufrufen.

Wenn Sie andere Sortierideen haben und beispielsweise nicht der natürlichen Sortierung folgen möchten, können Sie auch einen Komparator übergeben, z. B. umgekehrt.

Der Fall verschiedener Elemente ist komplizierter und kann vorerst ignoriert werden.


Wenn Sie eine neue Klasse wie Player haben und diese sortieren möchten, lassen Sie sie im Allgemeinen die Schnittstelle Comparable und die Methode CompareTo implementieren. Wenn Sie beispielsweise nach dem Alter sortieren möchten, beginnend mit dem kleinsten, können Sie Folgendes implementieren:

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();
       }
}

Die Comparable-Schnittstelle sortiert standardmäßig in natürlicher Reihenfolge. Natürlich können Sie das direkt verwenden CompareTo-Methode unerwartet Es ist in Ordnung, es umgekehrt zu implementieren, aber tun Sie es nicht gemäß der Vereinbarung. Wenn Sie es nicht verwechseln, können andere es verwechseln. Wenn alles vereinbarungsgemäß erledigt wird, ist die Wahrscheinlichkeit geringer, dass es zu Verwirrung kommt. Daher wird Comparator tatsächlich verwendet, wenn Sie mit der natürlichen Sortierung nicht zufrieden sind oder wenn eine einfache natürliche Sortierung nicht die gewünschte Sortierung erreichen kann. Wenn Sie beispielsweise nach dem absoluten Wert der Werte sortieren möchten, können Sie Comparable natürlich nicht verwenden. Sie müssen selbst eine Comparator-Implementierungsklasse schreiben, die Vergleichsmethode implementieren und je nach Wunsch positive, negative oder Nullzahlen zurückgeben.

Es gibt einige Komparatoren, die mit dem System geliefert werden, wie zum Beispiel Collections.reverseOrder(), String.CASE_INSENSITIVE_ORDER.


2.Set-Sortierung

Java verfügt über eine Implementierungsklasse für Sets, die in natürlicher Reihenfolge angeordnet sind: TreeSet. Arbeiten Sie einfach mit der Referenz dieses TreeSet-Objekts Habe es selbst geregelt. Natürlich bietet TreeSet auch mehrere Konstruktoren, insbesondere den Konstruktor, der Parameter vom Typ Comparator empfängt, sodass Entwickler nach ihren eigenen Vorstellungen sortieren können und nicht nur auf die natürliche Sortierung beschränkt sind.


Eine andere Möglichkeit besteht darin, die Menge direkt in ein Listenobjekt einzufügen und dann die Sortierung zu verwenden.


3.Kartensortierung

Das ist etwas mühsamer.

Map ist ein Schlüssel-Wert-Paar und kann daher nach Schlüssel oder Wert sortiert werden. Da die Schlüssel nicht gleich sein können, die Werte aber gleich sein können, werden normalerweise viele Werte zum Sortieren verwendet. Lassen Sie uns zunächst ein Beispiel geben.

Das Prinzip ist eigentlich, dass es am Ende bequemer ist, es in eine Liste umzuwandeln.

Beim Durchlaufen von Map müssen Sie etwas namens Map.Entry verwenden. Wenn Sie eine Map-Objektkarte haben, können Sie map.entrySet() verwenden, um ein Set-Objekt abzurufen, das mit Map.Entry gefüllt wird . Wenn Sie iterieren möchten, können Sie einfach den Iterator verwenden, um alle darin enthaltenen Elemente abzurufen. Wenn Sie sortieren möchten, fügen Sie diesen Satz am besten in eine Liste ein, definieren Sie dann ein Comparator-Objekt, implementieren Sie darin die Vergleichsmethode, geben Sie einen Unterschied zurück, z. B. den Unterschied in den Punktzahlen der Athleten, und verwenden Sie dann Collections.sort Methode, übergeben Sie das Listenobjekt und das Komparatorobjekt, und die Sortierung ist abgeschlossen.

Geben Sie mir ein Beispiel

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;  
    }   
}

Nach dieser Sortierung wird am Ende der folgende Inhalt ausgegeben


Ben :3000

Jack:2000

John:1000


Zusammenfassend lässt sich sagen, dass alle Satzsortierungen in Listensortierungen umgewandelt werden können . Weil Collections selbst die Listensortierung unterstützt.

Karte kann in einen Satz umgewandelt werden, und Satz kann in eine Liste umgewandelt werden, sodass beide in eine Liste umgewandelt werden können.

1. Im einfachsten Fall implementiert die zu sortierende Klasse eine Comparable-Schnittstelle, implementiert dann die Vergleichsmethode, führt die Subtraktion auf natürliche Weise durch, gibt das Ergebnis der Subtraktion zurück und verwendet dann direkt Collections.sort Die Methode (Listenliste) reicht aus. Diese Art wird als natürliche Sortierung bezeichnet und ist nur für die ursprüngliche Liste und Menge geeignet.

2. Wenn Sie keine natürliche Sortierung verwenden möchten, kein Problem, dann definieren Sie ein Comparator-Objekt, implementieren Sie dort die Logik und verwenden Sie dann Collections.sort(List list, Comparator comparator).

3. Bei Map ist es etwas komplizierter, aber das Prinzip ist der zweite Fall.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn