8

カードの値を表す文字列のArrayListを並べ替えようとしています。したがって、一部のカードには文字( "King")が含まれ、一部のカードには数字のみを含む文字列( "7")が含まれます。私はCollections.sortを使用することを知っていますが、文字を含む文字列のみをソートします。ArrayListを番号とアルファベット順に並べ替えるにはどうすればよいですか?

編集:申し訳ありませんが、並べ替えを見たときにあまり注意を払っていなかったに違いありません。並べ替えは正しく機能します。2の前に10が来るという事実に、私はただ見捨てられたに違いありません。ありがとう

4

5 に答える 5

10

いいえ、Collections.sortUnicode順序辞書式比較を使用してすべてを並べ替えます。これは、の動作ですString.compareTo。「7」は「King」の前にあり、「10」は「2」の前にあります。

于 2010-06-08T16:14:32.710 に答える
4

私が理解しているように、次のような配列があり、並べ替えが完了した後、次["7", "Queen", "9", "6"]のように["Queen", "9", "7", "6"](または逆の順序で) 表示する必要があります。

もう少しオブジェクト指向にすることをお勧めします。つまり、フィールド名と値を持つクラス Card を作成します。

class Card {
   private final String name;
   private final int value;
   ...
   //constructor and getters
}

その後、次の方法でインスタンスを作成します。

Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);

その後、valueカードの名前の代わりにフィールドを使用して、カードを使用したすべての操作 (および特に並べ替え) を行う方がはるかに簡単になります。

于 2010-06-08T16:20:21.560 に答える
1

@Jon Skeet が言ったように、組み込みの並べ替えは Unicode 値に基づいて比較されます。独自のソート方法を作成する必要があります。

ただし、独自のコードを作成している限り、列挙を提案できますか? カードのデッキは、列挙型の使用の標準的な例の 1 つです。短いバージョンは、物事のグループに対して独自のソート順を宣言できるということです。必要に応じて、スペードのキングをダイヤモンドのキングよりも高くすることもできます。ここでSun のチュートリアルをチェックしてください。

于 2010-06-08T16:20:03.740 に答える
0

私はCollections.sortを使用することを知っていますが、文字を含む文字列のみをソートします。ArrayListを番号とアルファベット順に並べ替えるにはどうすればよいですか?

文字列が数値の場合、すでに並べ替えられています(ただし、文字列として)。

import java.util.*;
class Sort {
    public static void main( String [] args  ) {
        List list = Arrays.asList("Kings","7", "Abcd", "3.1416");
        Collections.sort( list );
        System.out.println( list );
    }
}

プリント

$ java Sort
[3.1416, 7, Abcd, Kings]

それはあなたが必要なものですか?

編集

必要なのは、数字と「文字」(J、Q、K、A)の両方を持つトランプのデッキを並べ替えることであると仮定して(推測)、カスタムコンパレータを使用してみることができます。

これは、数字を「数字として」、残りを文字列として考慮したものです。したがって、「10」は「2」の後、「Kings」の前になります。

import java.util.*;
class Sort {
    public static void main( String [] args  ) {

        List<String> list = Arrays.asList("Kings","7", "Queen", "3", "10", "A", "2", "8", "Joker");
        Collections.sort( list , new Comparator<String>(){
            public int compare( String a, String b ){
                // if both are numbers
                if( a.matches("\\d+") && b.matches("\\d+")) {
                    return new Integer( a ) - new Integer( b );
                }
                // else, compare normally. 
                return a.compareTo( b );
            }
        });
        System.out.println( list );
    }
}

$ java Sort
[2, 3, 7, 8, 10, A, Joker, Kings, Queen]

それがあなたが必要とするものであるならば、私はこれがあなたが残りを理解するのを助けるだろうと思います。おそらく次のことは、スペードとハートをどのように分類するかでしょう。

Romanの回答に従って、クラスを作成し、Comparableインターフェイスを実装できます。

  class Card implements Comparable<Card> {
       public int compareTo( Card other ) {  
           // add custom logic to compare one card with other 
       }
   }
于 2010-06-08T16:14:36.860 に答える
0

並べ替えは、文字セットに従ってすべてを並べ替えます。つまり、すべての数字は辞書式順序で文字の前に表示されます。たとえば、10進数は「。」で始まります。辞書式順序で順序が狂っています。

これを変更したい場合は、Comparatorオブジェクトを作成してください。その後、好きな順序でアイテムを配置できます。

たとえば、これは数字を番号順に並べ替え、単語も辞書式順序で並べ替えます。

class CardComparator extends Object implements Comparator{
 public int compare(Object a, Object b){
  try{
   double d1=Double.valueOf(a.toString());
   try{
     double d2=Double.valueOf(b.toString());
     return (d2>d1)?1:-1;            // both numeric
   }catch(NumberFormatException e){ // a is numeric but b isn't
     return 1;
   }
  }catch(NumberFormatException e){  
    try{
     double d2=Double.valueOf(b.toString()); 
     return -1;                       // a is nonnumeric but b is
    }catch(NumberFormatException e){  // both nonnumeric
      return a.toString().compareTo(b.toString);
    }
  }
 }
}
Comparator comparator=new CardComparator();
Collections.sort(cards, comparator);

PSはテストされていません!

于 2010-06-08T16:16:07.003 に答える