ホームページ  >  記事  >  Java  >  Javaコレクションオブジェクトのソート

Javaコレクションオブジェクトのソート

伊谢尔伦
伊谢尔伦オリジナル
2016-12-05 11:19:431738ブラウズ

1.リストのソート

これは配列のソートとは異なります。

実際、Java には配列とリストを並べ替える実装があり、配列の場合は Arrays.sort を直接使用でき、リストとベクトルの場合は Collections.sort メソッドを使用できます。

Java API は、コレクション型を並べ替えるための 2 つのメソッドを提供します:

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

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

コレクション内の要素がすべて同じ型で、Comparable インターフェイスを実装している場合は、最初のメソッドを直接呼び出すことができます。

他の並べ替えのアイデアがある場合、たとえば、自然な並べ替えに従いたくない場合は、reverse などのコンパレータを渡すこともできます。

異なる要素の場合はより複雑になるため、今のところは無視できます。


一般に、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 実装クラスを自分で作成し、compare メソッドを実装して、必要に応じて正、負、またはゼロの数値を返す必要があります。

Collections.reverseOrder()、String.CASE_INSENSITIVE_ORDER など、システムに付属するコンパレーターがいくつかあります。


2.Setソート

JavaにはTreeSetという自然な順序で並べられるSetの実装クラスがあり、このTreeSetオブジェクトの参照を操作するだけで勝手にソートされます。もちろん、TreeSet は複数のコンストラクター、特に Comparator 型パラメーターを受け取るコンストラクターも提供しており、開発者が自然な並べ替えに限定されず、独自のアイデアに従って並べ替えることができます。


もう 1 つの方法は、セットをリスト オブジェクトに直接ロードし、並べ替えを使用することです。


3.地図の並べ替え

これは少し面倒です。

マップはキーと値のペアであるため、キーまたは値で並べ替えることができます。通常、キーは同じにすることはできませんが、値は同じにすることができるため、並べ替えには多くの値が使用されます。まず例を挙げてみましょう。

実際には、最終的にはリストに変換する方が便利であるという原則があります。

Map を走査するときは、Map.Entry と呼ばれるものを使用する必要があります。Map オブジェクトのマップがある場合は、必要に応じて、map.entrySet() を使用して、Map.Entry で満たされたセット オブジェクトを取得できます。トラバースでは、単純に反復子を使用して内部のすべての要素を取得します。並べ替える場合は、このセットをリストに入れてから、Comparator オブジェクトを定義し、その中に Compare メソッドを実装し、アスリートのスコアの差などの差を返してから、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 インターフェイスを実装し、compare メソッドを実装し、自然な方法で減算を実行し、減算の結果を返し、Collections.sort(List list) を直接使用します。この方法で十分です。この種類は自然ソートと呼ばれ、元のリストとセットにのみ適しています。

2. 自然な並べ替えを使用したくない場合は、Comparator オブジェクトを定義し、そこにロジックを実装してから、Collections.sort(List list, Comparator comparator) を使用します。

3. マップの場合はもう少し複雑ですが、原則は 2 番目のケースです。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。