2016-06-28 81 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(",", "")); 
} 

注追加數組列表中的字符。在特定位置

字符c - 表示字母被用戶

透露進入 - 是一個聲明爲BitSet中

INT sizeReset - 是字的大小來猜測

假設ArrayList的EO = new ArrayList();在方法外聲明。 (全球)

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

這是我到目前爲止。假設我會猜測「香蕉」。用戶輸入的字母將被顯示,其餘的將被標記爲「*」。

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

問題:它將包含「」的整個值附加到arrayList中存儲值的末尾,而不是我希望它們的特定位置(也包括「」)。只有用戶輸入的字母)。 * HANGMAN GAME的邏輯。

示例:

首字母輸入: 「A」

OUTPUT:

_a_a_a

進入第二個字母 「N」

OUTPUT:

_ _n_n_

(這是錯誤的)

正確的輸出應該是:

_anana

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

我是新來的字符串操作,我遇到了這個部分的麻煩。我已經閱讀了一些關於StringBuilder的內容,但我還沒有弄明白。如果你能幫助我,那將非常棒。提前致謝。 :)

回答

1

你說得對,這可以使用StringBuilder完成。您只需將包含char的原始String索引中的char替換爲char,這可以使用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存儲在reveal方法中。這意味着每次輸入字符時都會創建新的ArrayList。要解決這個問題,你必須到ArrayList存儲這樣的揭示方法之外:

package xyz; 

public class Name{ 

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

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

感謝您的回覆。我已經嘗試過了。它追加到arrayList中存儲值的末尾,但不在我想要它們的適當位置。請看看我提供的輸入和輸出樣本。 –

+0

你搞錯了。您必須將ArrayList移出reveal(char c)方法。見上面的代碼示例。 – NoRelect

+0

我已經做了。如果那是你指出的,我把它變成全球先生。它只追加到存儲在arrayList中的值的末尾。 –