2016-06-28 80 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中的值的末尾。 –