1

Java文字列に出現する文字数を数えようとしています。

例えば:

ポーカーハンドを考えると6s/3d / 2H / 13c / Ad

/文字は何回出現しますか?= 4

ユーザーはカード変数の数を変えて別のハンドを入力できるため、発生をチェックするメソッドをハードコーディングしても機能しません。

セパレータは、次のいずれかになります。-/スペース(片手で使用できるセパレータタイプは1つだけです)。したがって、いずれかのセパレータが4回発生するかどうかを確認できる必要があります。そうでない場合は、誤った形式が指定されています。

これが私がやろうとしていることのより良いアイデアを与えるためのいくつかのJavaコードです:

    String hand = "6s/1c/2H/13c/Ad";
    System.out.println("Original hand: " + hand);

    // split the hand string into individual cards
    String[] cards = hand.split(hand);

    // Checking for separators
    // Need to check for the correct number of separators
    if(hand.contains("/")){
        cards = hand.split("/");
    } else if (hand.contains("-")){
        cards = hand.split("-");
    } else if (hand.contains(" ")){
        cards = hand.split(" ");
    } else {
        System.out.println("Incorrect format!");

    }

どんな助けでも素晴らしいでしょう!

また、これは学校のプロジェクト/宿題です。

編集1------------------------------------------------- --------

OK、これがあなたの提案の後の私のコードです

    String hand = "6s 1c/2H-13c Ad";
    System.out.println("Original hand: " + hand);

    // split the hand string into individual cards
    String[] cards = hand.split("[(//\\-\\s)]");

    if (cards.length != 5) {
        System.out.println("Incorrect format!");    
    } else {

        for (String card : cards) {
            System.out.println(card);
        }
    }

上記の特定のハンドは、ユーザーが特定のハンドに対して1つのタイプのセパレーターしか使用できないため、正しい形式ではありません。例えば:

  • 6s / 1c / 2H / 13c/Ad-正解
  • 6s-1c-2H-13c-広告-正解
  • 6s 1c 2H13cAd-正解

ユーザーが1種類のセパレーターのみを使用するようにするにはどうすればよいですか?

これまでの答えに乾杯!

編集2-------------------------------------------

したがって、ネストされたifステートメントをいじってみると、私のコードは次のようになります。

    String hand = "6s/1c/2H/13c/Ad";
    System.out.println("Original hand: " + hand);

    // split the hand string into individual cards

    if(hand.contains("/")){
        String[] cards = hand.split("/");
        if(cards.length != 5){
            System.out.println("Incorrect format! 1");
        } else {
            for (String card : cards) {
                System.out.println(card);
            }
        }

    } else if(hand.contains("-")){
        String[] cards = hand.split("-");
        if(cards.length != 5){
            System.out.println("Incorrect format! 2");
        } else {
            for (String card : cards) {
                System.out.println(card);
            }
        }

    } else if(hand.contains(" ")){
        String[] cards = hand.split(" ");
        if(cards.length != 5){
            System.out.println("Incorrect format! 3");
        } else {
            for (String card : cards) {
                System.out.println(card);
            }
        }
    } else {
        System.out.println("Incorrect format! 4");
    }

この方法は意図したとおりに機能しますが、醜いです!

どんな提案でも大歓声になります。

4

4 に答える 4

1

答えを与えることなく、返される文字列の配列が次のようになるように分割する区切り文字を指定する必要があります。

cards[0] = "6s"
cards[1] = "1c"
cards[2] = "2H"
.
.
.

特定の手のストリングには、これを達成するために使用できる各カードの便利なセパレーターがあります...

于 2012-08-04T06:23:30.797 に答える
0

最初の質問編集の前にこれを書いたので、追加の質問ではなく、元の質問に回答しています。

String.splitのドキュメントでは、空の文字列が部分文字列としてカウントされるかどうかが不明です。注意して"--".split("-").length == 0ください。この質問は、2 つ以上の文字が区切り文字を区切ることを暗黙のうちに保証するかもしれませんが、それは危険な仮定であり、Java の String.split が問題になる場所です。

これは部分的に単純な実装です:

    char[] delims = {'/', ' ', '-'};
    int result = 0;
    for (char delim : delims) {
        for (int i = 0; i < hand.length(); i++) {
            if (hand.charAt(i) == delim) {
                ++result;
            }
        }
    }

完全なコードは、宿題を目的とした編集コメントとともに続きます。

interface Counter {
    int count(String hand);
}
class FirstCounter implements Counter {
    public int count(String hand) {
        String[] cards = hand.split(hand);
        if(hand.contains("/")){
            cards = hand.split("/");
        } else if (hand.contains("-")){
            cards = hand.split("-");
        } else if (hand.contains(" ")){
            cards = hand.split(" ");
        } else {
            // Prefer to fail fast unless your requirement
            // really is to only print "incorrect format"
            //System.out.println("Incorrect format!");
            throw new RuntimeException("Incorrect format!");
        }
        if (hand.endsWith("-") || hand.endsWith("/") || hand.endsWith(" ")) {
            return cards.length;
        }
        return cards.length - 1;
    }    
}
class SecondCounter implements Counter {
    public int count(String hand) {
        char[] delims = {'/', ' ', '-'};
        int result = 0;
        for (char delim : delims) {
            for (int i = 0; i < hand.length(); i++) {
                if (hand.charAt(i) == delim) {
                    ++result;
                }
            }
        }
        if (result == 0) {
            // This is a hack or inconsistent with requirements,
            // but necessary to match original posted code behavior
            throw new RuntimeException("Incorrect format!");
        }
        return result;
    }
}
class Main {
    private static int testCount = 0;

    static void realAssert(boolean condition) {
        if (!condition) {
            throw new AssertionError("Java has no real assert");
        }
    }

    static void test(Counter counter) {
        ++testCount;
        try {
            realAssert(counter.count("6s/3d/2H/13c/Ad") == 4);
            realAssert(counter.count("6s-3d-2H-13c-Ad") == 4);
            realAssert(counter.count("6s 3d 2H 13c Ad") == 4);
            // Don't forget boundary conditions
            realAssert(counter.count("6s-3d-2H-13c-") == 4);
            realAssert(counter.count("6s/3d/2H/13c/") == 4);
            realAssert(counter.count("6s 3d 2H 13c ") == 4);
            realAssert(counter.count("-6s-3d-2H-13c-") == 5);
            realAssert(counter.count("/6s/3d/2H/13c/") == 5);
            realAssert(counter.count(" 6s 3d 2H 13c ") == 5);
            realAssert(counter.count("--") == 2);
            // Remember to test error conditions
            try {
                counter.count("foobar");
                realAssert(false);
            } catch (RuntimeException e) {
                // Catching RuntimeException is normally bad
                // done only as example.
                // Also normally bad, this is an empty catch
                // block. These are sometimes useful, but always
                // at least add a comment that explains that this
                // catch block really should be empty, in this case
                // because the test was meant to throw an Error.
            }
            try {
                counter.count("foo/bar-baz");
                // Left as exercise for reader, based on question
                // it is possible this should be disallowed.
                //realAssert(false);
            } catch (RuntimeException e) {
                // Ditto above, intentionally empty catch
            }
            System.out.println("Test " + testCount + " succeeded");
        }
        catch (Error e) {
            // XXX: Don't catch Error in non-example code
            System.out.println("Test " + testCount + " failed");
            /* Normally don't use printStackTrace either */
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        test(new FirstCounter());
        test(new SecondCounter());
    }
}

教育のためだけに、正規表現のアプローチが適している場合があります。ソリューション全体で、Ruby の 1 行が必要hand.split(/[\-\/ ]/, -1).length - 1です。

于 2012-08-04T09:26:51.037 に答える
0

使用するregex

例えば:

String reg = new String();
String s = "hjhjhkello/hi"; 
Pattern pattern = Pattern.compile("[(/-\\\\s)]");  // Will find for / or - or space
Matcher matcher = pattern.matcher(s);

while(matcher.find()){

 reg = matcher.group());

}


String[] arr = hand.split(reg);
于 2012-08-04T06:23:02.030 に答える
0

hand.split(hand)動作しません。@home が言ったように、正規表現で入力文字列を分割する必要があります。正規表現は、入力文字列全体と一致する必要はなく (すべきではない)、個々のセパレータと一致する必要があることを理解してください。これはString.split、正規表現が渡されたときにどのように機能するかです。正規表現が一致する各場所が区切り文字として使用され、一致間の部分が配列として返されます。

ですから: 任意の 1 つの区切り文字に一致する正規表現を作成してみてください。次に、返された配列の要素数が正しいことを確認します。配列が と呼ばれる場合、そのためにhand使用できますhand.length

于 2012-08-04T06:25:48.233 に答える