【问题标题】:append characters in arraylist in a specific position将arraylist中的字符附加到特定位置
【发布时间】:2016-10-30 10:26:58
【问题描述】:
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 - 是用户输入的字母

revealed - 被声明为 BitSet

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

假设 ArrayList eo = new ArrayList();在方法之外声明。 (全球)

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

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

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

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

示例:

输入的第一个字母:“a”

输出:

_a_a_a

输入的第二个字母:“n”

输出:

_ _n_n_

(这是错误的)

正确的输出应该是:

_anana

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

我是字符串操作的新手,我在这部分遇到了麻烦。我读过一些关于 StringBuilder 的东西,但我还没有弄清楚。如果你能帮助我,那就太好了。提前致谢。 :)

【问题讨论】:

    标签: java append


    【解决方案1】:

    你是对的,这可以使用StringBuilder 来完成。您只需要将包含char 的原始String 中的索引处的chars 替换为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()));
            }
        }
    
    }
    

    【讨论】:

    • 这正是我想要的。非常感谢,但是有没有办法可以保留空白?这是我的程序唯一缺少的东西。
    • 先生,您能否通过编辑有关空白的小修改的代码来节省您的时间?这样我就可以将其标记为正确答案。顺便说一句,即使没有小修改,但如果你能添加它会很棒。我对字符串操作真的很陌生,我无法完全理解您提供的代码。我还在理解它的过程中。这也是为了其他遇到同样问题的人的利益。再次,提前感谢:)
    【解决方案2】:

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

    package xyz;
    
    public class Name{
    
         public ArrayList<String> eo = new ArrayList<String>();
    
         public void reveal(char c){
              // Reveal Code here
         }
    }
    

    【讨论】:

    • 感谢您的回复。我已经试过了。它附加到 arrayList 中存储值的末尾,但不在我希望它们所在的正确位置。请看一下我提供的输入和输出示例。
    • 你弄错了。您必须将 ArrayList 从reveal(char c) 方法中移出。请参阅上面的代码示例。
    • 我已经做到了。我把它变成了全球先生,如果这就是你所指出的。它只附加到存储在 arrayList 中的值的末尾。
    • 结果与您现在在问题中描述的不同吗?因为在您的问题中,您声明第二个字符之后的输出被完全替换,而不是附加。
    • 是的,但这不是我想要的结果。请原谅我的问题可能是错误的。我会尽快编辑它。
    猜你喜欢
    • 2020-12-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多