将arraylist中的字符追加到特定位置

时间:2016-06-28 07:58:14

标签: java append

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(",", "")); 
}

注意:

String wordCompare - 包含要猜测的单词。

char c - 是用户输入的字母

透露 - 声明为BitSet

int sizeReset - 是要猜的单词的大小

确定ArrayList eo = new ArrayList();在方法之外声明。 (全局)

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

这是我到目前为止所拥有的。假设我会猜测“香蕉”。将显示用户输入的字母,其余字母将标记为“*”。

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

问题:它将包括“”在内的整个值附加到arrayList中存储值的末尾,而不是在我希望它们的特定位置。(还有“”应该附加时不包括在内,只包括用户输入的字母。 *悬挂游戏的逻辑。

示例:

输入第一个字母:“a”

输出:

_a_a_a

输入第二个字母:“n”

输出:

_ _n_n _

(这是错误的)

正确的输出应为:

_anana

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

我是String操作的新手,我在使用这部分时遇到了麻烦。我已经阅读了一些关于StringBuilder的内容,但我还没有想到它。如果你可以帮助我真的很棒。提前致谢。 :)

2 个答案:

答案 0 :(得分:1)

问题是您在reveal方法中存储包含替换字符的ArrayList。这意味着每次输入字符时都会创建新的ArrayList。要解决此问题,您必须将revealList存储在reveal方法之外,如下所示:

package xyz;

public class Name{

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

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

答案 1 :(得分: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()));
        }
    }

}