12

リストを並べ替えるクラスがあります。

import java.util.*;

public class First 
{

    private static HashMap<String,Second> msgs;

    public static void main(String[] args) 
    {           

    List<String> ls=new ArrayList<String>();


   ls.add("fourth");
   ls.add("2");
   ls.add("second");
   ls.add("first");
   ls.add("third");
   ls.add("1");

   Iterator it=ls.iterator();

   // before sorting
   while(it.hasNext())
   {
     String s=(String)it.next();
     System.out.println(s);
   }

   Collections.sort(ls, new Comparator(){
       public int compare(Object o1, Object o2) {
           return -1;
           // it can also return 0, and 1
        }
    });

System.out.println(" ");

//after sorting
   Iterator iti=ls.iterator();
   while(iti.hasNext())
   {
     String s=(String)iti.next();

     System.out.println(s);
   }

}


}

プログラムの実行後、次の値を取得します。

1    
third
first
second
2
fourth

私の質問は、ここでのCollection.sort()関数の動作は何ですか。比較関数から-1を返すと、リストの逆の順序になります。では、どうすれば他の並べ替え順序を取得できますか?0と1を返す役割は何ですか?

4

6 に答える 6

15

最後に、この方法で並べ替え関数を変更して、並べ替えられたデータを取得しました。

 Collections.sort(ls, new Comparator() 
                           {

                            public int compare(Object o1, Object o2) 
                            {
                            String sa = (String)o1;
                            String sb = (String)o2;

                            int v = sa.compareTo(sb);

                            return v;           

                                // it can also return 0, and 1
                            }
                           }    
                    );
于 2012-05-20T16:09:07.667 に答える
8

匿名クラスは次のように使用できます。

TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() {
    public int compare(String i1,String i2)
    {
        return i2.compareTo(i1);
    }
});
于 2015-07-03T13:20:21.347 に答える
6

javadocの内容は次のとおりです。

int compare(T o1、T o2)

順序について2つの引数を比較します。最初の引数が2番目の引数よりも小さい、等しい、または大きい場合、負の整数、ゼロ、または正の整数を返します。

コンパレータの実装はこのコントラクトを尊重しないため、結果は不確定です。o1がo2より小さいと見なす場合は、負の値を返す必要があります。o1がo2より大きいと見なす場合は、正の値を返す必要があります。また、o1がo2と等しいと見なす場合は、0を返す必要があります。そしてもちろんそれは一貫していなければなりません。o1 <o2の場合、o2>o1。o1<o2およびo2<o3の場合、o1<o3です。

于 2012-05-20T06:35:02.897 に答える
4

0と1を返す役割は何ですか?

これは、o1がo2に等しい、またはo1がo2より大きいということです。

あなたの匿名コンパレータは現在、とのすべての可能な値についてo1o2 o1はo2よりも小さいと言っています。これは単に意味がなく、の動作sortが予測不能になる原因になります。

有効なコンパレータはcompare(Object, Object)、インターフェイスの要件に従って動作するようにメソッドを実装する必要がありComparatorます。


リスト内の要素の順序を逆にすることが本当の目的である場合は、を使用しないでくださいsort。使用するCollections.reverse()

于 2012-05-20T06:35:34.073 に答える
4

java.util.Comparatorクラスはcompareメソッドjavadocで言います:

最初の引数が2番目の引数よりも小さい、等しい、または大きい場合の負の整数、ゼロ、または正の整数。

次のコードを使用できます。

Collections.sort(ls, new Comparator() 
{
    public int compare(Object o1, Object o2) 
    {
       if(o1 instanceof String && o2 instanceof String) 
       {
          String s_1 = (String)o1;
          String s_2 = (String)o2;

          return s_1.compareTo(s_2);
       } 
       return 0;    
    }
});

このコードは正常に機能する必要があります。比較方法を変更して柔軟性を高めることができます。

compareToクラスのメソッドStringは、そのjavadocで次のように述べています。

0引数文字列がこの文字列と等しい場合の値。0この文字列が辞書式順序で文字列引数よりも小さい場合よりも小さい値。0また、この文字列が辞書式順序で文字列引数よりも大きい場合よりも大きい値。

于 2012-05-20T06:45:43.633 に答える
1

コンパレータのJavadocから

Compares its two arguments for order.  Returns a negative integer,
 zero, or a positive integer as the first argument is less than, equal
 to, or greater than the second.

したがって、クラスに対してより小さい、等しい、またはより大きいの機能を定義すると、同等およびより大きい機能が失われます。

于 2012-05-20T06:37:01.777 に答える