2016-06-28 11 views
1
public void reveal(char c) { 

    for(int i = 0; i < sizeReset; i++) { 
     if(wordCompare.charAt(i) == c) revealed.set(i); 
     if(revealed.cardinality() == 0) { 
      eo.add(String.valueOf('*')); 
     } 
     else { 
      if(revealed.get(i) == true) { 
       eo.add(String.valueOf(wordCompare.charAt(i))); 
      } 
      else { 
       eo.add(String.valueOf('*')); 
      } 
     } 

} 
    System.out.println(eo.toString()); 
    jTextPane1.setText(eo.toString().replace("[", "").replace("]", "").replace(",", "")); 
} 

注:が特定の位置に配列リスト内の文字を追加し

文字列wordCompareは - 推測する単語が含まれています。

チャーC - ユーザ

によって入力される文字が明らかにされて - たBitSet

INT sizeResetとして宣言される -

を推測する単語の大きさはArrayListのEOと仮定されています=新しいArrayList();メソッドの外側で宣言されます。 (グローバル)

=========================================== ==

これは私がこれまで持っているものです。私が "バナナ"を推測するとしよう。ユーザーが入力した文字が表示され、残りは「*」としてマークされます。

=========================

問題:「」を含む値全体を、arrayList内の格納された値の末尾に追加します。特定の位置には追加しません(また、追加する際には「」を含めてはいけません)。ユーザーが入力した文字のみ)。 *漢人ゲームの論理。

SAMPLE:入力

最初の文字 ""

OUTPUT:入力

_a_a_a

第二の文字 "n" は

OUTPUT:

_

_n_n_

(間違っている)

正しい出力がなければならない:

_anana ======================= ==========================

私は文字列の操作に新しいです、そして、私はこの部分に問題があります。私は、StringBuilderのについて何かを読んだが、私はまだそれを考え出したていません。もしあなたが私を助けることができれば本当に素晴らしいだろう。前もって感謝します。 :)

答えて

1

そうだね、これはStringBuilderを使用して行うことができます。charを元のStringのインデックスに置き換えて、charcharと置き換える必要があります。これはsetCharAtを使用して行うことができます。

次のコードは、空白文字も同じにしています。これが、コンストラクタ内の空白を特別に扱う理由です。

import java.text.MessageFormat; 

public class StringReveal { 

    private final String original; 

    private final StringBuilder stringBuilder; 
    private String currentString; 
    private int missingLetters; 

    public StringReveal(String original, char placeholder) { 
     if (original.indexOf(placeholder) >= 0) { 
      throw new IllegalArgumentException("placeholder must not be contained in the string"); 
     } 

     if (Character.isWhitespace(placeholder)) { 
      throw new IllegalArgumentException("placeholder must not be a whitespace character"); 
     } 

     this.original = original; 
     this.stringBuilder = new StringBuilder(); 
     this.missingLetters = original.length(); 

     for (char c : original.toCharArray()) { 
      if (Character.isWhitespace(c)) { 
       // keep whitespace characters the same 
       missingLetters--; 
       stringBuilder.append(c); 
      } else { 
       // replace everything else with placeholder char 
       stringBuilder.append(placeholder); 
      } 
     } 
     this.currentString = stringBuilder.toString(); 
    } 

    public void reveal(char c) { 
     int index = original.indexOf(c); 
     if (index < 0 || currentString.charAt(index) == c) { 
      // if letter was already replaced or does not exist in the original 
      // there's nothing to do 
      return; 
     } 

     do { 
      // replace char 
      stringBuilder.setCharAt(index, c); 
      missingLetters--; 

      // find next char 
      index = original.indexOf(c, index + 1); 
     } while (index >= 0); 

     currentString = stringBuilder.toString(); 
    } 

    public String getCurrentString() { 
     return currentString; 
    } 

    public int getMissingLetters() { 
     return missingLetters; 
    } 

    public static void main(String[] args) { 
     StringReveal stringReveal = new StringReveal("banana bread", '*'); 

     char[] guesses = {'a', 'x', 't', 'a', 'b', 'k', 'n', 'g', 'd', ' ', '*', 'r', 'w', 'e'}; 

     System.out.println("Try to guess this sting: " + stringReveal.getCurrentString()); 

     for (char guess : guesses) { 
      stringReveal.reveal(guess); 
      System.out.println(MessageFormat.format("Current String: {0} ; guess: ''{1}''; you still have to guess {2} letters", 
        stringReveal.getCurrentString(), 
        guess, 
        stringReveal.getMissingLetters())); 
     } 
    } 

} 
+0

これはまさに私が探していたものです。どうもありがとうございましたが、空白を保存できる方法はありますか?それが私のプログラムに欠けている唯一のものです。 –

+0

空白に関するマイナーリビジョンのコードを編集することで、あなたの時間を少し余裕ができますか?私はこれを正解とマークすることができます。これは軽微な改訂がなくてもBTWですが、追加することができればそれは素晴らしいことです。私は文字列操作にはまったく新しいので、あなたが提供したコードを完全に理解することはできません。私はまだそれを理解しています。これは、同じ問題を経験している他の人々の利益のためです。もう一度、事前に感謝:) –

1

問題は、置換された文字を含むArrayListを公開メソッドに格納することです。これは、文字が入力されるたびにArrayListが新たに作成されることを意味します。この問題を解決するには、次のように明らかにメソッドの外でのArrayListを保存する必要があります。

package xyz; 

public class Name{ 

    public ArrayList<String> eo = new ArrayList<String>(); 

    public void reveal(char c){ 
      // Reveal Code here 
    } 
} 
+0

ご回答ありがとうございます。私はすでにそれを試みました。 arrayList内に格納された値の最後に追加されますが、それらの値が正しい位置には追加されません。 Plsは私が提供した入力と出力のサンプルを見ています。 –

+0

あなたが間違っている。あなたは、reveal(char c)メソッドからArrayListを移動する必要があります。上記のコード例を参照してください。 – NoRelect

+0

私はすでにやりました。それがあなたが指摘しているものなら、私はそれをグローバルな国にしました。これは、arrayListに格納されている値の最後にのみ追加されます。 –

関連する問題