-4

ポーカーのランクは 2345..9TJQKA です

カードの配列 String s[] = {"Qh", "Jd", "2h"} が与えられます。

戻りたい

s[] = {"2h", "Jd", "Qh"}

これが私のコードです:

         Arrays.sort(s, new Comparator<String>() {
        @Override
        public int compare (String s1, String s2) {
            int v1 = (int) s1.charAt(0);
            int v2 = (int) s2.charAt(0);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v2 == 65) v2 = 100;
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v2 == 75) v2 = 85;
            if (v1 == 84) v1 = 60;
            if (v2 == 84) v2 = 60; //changes the value of T
            return v1 - v2;
        }
    }

配列は変更されません。

4

4 に答える 4

1

以下を使用してコードをテストしました。

import java.util.*;

public class test {
   public static void main(String... args) {
      String s[] = {"Qh", "Jd", "2h"};
      Arrays.sort(s, new Comparator<String>() {
         @Override
         public int compare (String s1, String s2) {
            int v1 = (int) s1.charAt(0);
            int v2 = (int) s2.charAt(0);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v2 == 65) v2 = 100;
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v2 == 75) v2 = 85;
            if (v1 == 84) v1 = 60;
            if (v2 == 84) v2 = 60; //changes the value of T
            return v1 - v2;
         }
      });
      for (String card : s) {
         System.out.println(card);
      }   
   }
}

それは印刷します:

2h
Jd
Qh

それは私にとってはうまくいったので、ソートルーチンを呼び出し/使用する方法に問題があるのか​​もしれません

于 2013-01-16T02:23:05.323 に答える
0

あなたのプログラムをもっと見ないと、何が間違っているのかを正確に言うのは難しいですが、compare. ifとは対照的に、ステートメントを繰り返すことによりif/else、2 つの if ステートメントを v1 または v2 で実行できます。の使用を検討してくださいswitch

もう 1 つの観察結果は、この種のものがカプセル化に適しているということです。メソッド内で「変換」しようとするのではなく、各カードの値を非表示にする Card クラスを使用しないのはなぜcompareですか?

于 2013-01-16T02:14:58.740 に答える
0

実際の文字列を変更するのではなく、それぞれの手の最初の文字の ASCII コードの一時的なコピーを変更しています。

最初にループして文字列を置き換えてから、カスタムロジックで並べ替えます。これは O(n*2)ですが、それでもかなり高速です。一度に数百万のハンドを処理することはありませんよね?

私はあなたのためにそれをするのに十分退屈しています:

import java.util.*;
import java.lang.*;

class Main {
    public static void main(String[] args) throws java.lang.Exception {
        String s[] = {
            "Ad", "2h", "Qh" //I replaced it with an A so your replacement code can kick in
        }; //See http://www.asciitable.com/index/asciifull.gif
        String mod[] = new String[s.length];
        for(int i = 0; i < s.length; i++) {
            int v1 = s[i].charAt(0);
            int v2 = s[i].charAt(1);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v1 == 84) v1 = 60;
            String a1 = (char)v1 + "";
            String a2 = (char)v2 + "";
            mod[i] = a1 + a2 + "";
        }
        Arrays.sort(mod, new Comparator < String > () {
            @Override
            public int compare(String s1, String s2) {
                int v1 = (int) s1.charAt(0);
                int v2 = (int) s2.charAt(0);
                return v1 - v2;
            }
        });
        for (int i = 0; i < mod.length; i++)
            System.out.println(mod[i]);
    }
}

おっと、それは確かに O(n*2) ではありません.

于 2013-01-16T02:16:25.683 に答える
0

comparisonInstance.compareのjavadoc を調べます。

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

したがって、v1 と v2 の差を返しているのは、一見奇妙に思えます。

于 2013-01-16T01:58:20.337 に答える