【问题标题】:Attempting to change a dash to a letter with loop尝试将破折号更改为带有循环的字母
【发布时间】:2013-03-16 12:22:58
【问题描述】:

所以我正在为这个全新的、从未听说过的名为 hangman (ha.) 的游戏编写一个程序,并且我很难编写一个能够给我想要的结果的循环。我被困在一个正确的字母被猜到的地方(通过按钮按下)并在代表隐藏单词的破折号行中显示正确的字母。现在,当我运行这个循环时,我的测试器弹出窗口仍然会弹出“匹配!---”或者当前的秘密单词有多少破折号。从字面上看,就好像 replaceAll 实际上并没有替换它!我已经为此困扰了好几个小时,没有休息,所以如果这是我非常明显的遗漏,我不会感到惊讶。

JButton btnA = new JButton("A\n");
btnA.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        String letter = "a";
        char ch = 'a';
        if (go.getWordInQuestion().contains(letter)) {
            for(int i = 0; i<go.getWordInQuestion().length(); i++) {
                //Replace dashes with correctly guessed letter              
                if(go.getWordInQuestion().charAt(i)== 0)
                    go.getGuessLength().replaceAll("[^" + letter + "]", "_").charAt(i);
            }
            //check to see what the new value of the "hidden word" getGuessLength looks like                
            JOptionPane.showMessageDialog(null, "Match! " + go.getGuessLength());
            txtGuess.setText("" + go.getGuessLength()); 
        } else
            JOptionPane.showMessageDialog(null,"No Match :(");
    }
});

*****编辑***** 好的,所以我取得了进展(我认为)。我现在写了一个循环,将破折号更改为字母!!唯一的问题?它改变了所有这些。 -___- 所以现在当我按下按钮 A 时,如果有匹配项,而不是 ---,它将读取 aaa。我绝对意识到这个问题可能非常初级,但是当涉及到 java 时,我是一个学习缓慢的人!感谢所有积极且内容丰富的反馈!

JButton btnA = new JButton("A\n");
btnA.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        String letter = "a";
        StringBuilder guessA = new StringBuilder('a');
        for(int i = 0; i<go.getGuessLength().length();i++) {
            if(go.getWordInQuestion().charAt(i)=='a') {
                String partialWord = go.getGuessLength().replace("-", letter);
                txtGuess.setText(partialWord);
                JOptionPane.showMessageDialog(null,"Match! " + partialWord);
            }
        }
    }
});

*****编辑两个******

好的!我想我终于解决了这个问题,感谢你们的帮助!当用户按下“A”按钮时,如果隐藏单词中有 A,现在它已成功替换为破折号!哇哦!

btnA.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        String letter = "a";
        StringBuilder guessA = new StringBuilder(go.getGuessLength());
        if(go.getWordInQuestion().contains(letter)) {
            for(int i = 0; i<go.getGuessLength().length();i++) {
                if(go.getWordInQuestion().charAt(i)=='a') {
                    StringBuilder partialWord = guessA.replace(i,i+1, letter);
                    txtGuess.setText(guessA.toString());
                    JOptionPane.showMessageDialog(null,"Match! " + partialWord);
                }
            }
        } else
            JOptionPane.showMessageDialog(null, "Incorrect");
    }
});

【问题讨论】:

  • 除了 JB 的注释之外,逻辑很难理解。这个语句应该测试什么:if(go.getWordInQuestion().charAt(i)== 0)?测试一个字符为零是很不寻常的。
  • 我当然希望您不要为字母 B-Z 重复上述代码。即使您有 26 个不同的按钮处理程序例程(我确信可以避免),其余代码也可以是一个公共子例程。
  • 好吧,我想我自己搞糊涂了;我认为 char 0 被定义为字母 a?所以我写了上面这行来测试我的密语是否在charAt(i)点等于字母a,guessLength也等于a。所以我的循环应该将每个guessLength.charAt(i) 从“-”更改为字母a。
  • 零是 ASCII 控制字符 NUL 的数值。不是您在普通情况下使用的东西(在 C 中表示字符串的结尾除外)。 “a”是十进制 97 或十六进制 61。请参阅ASCII table。
  • 提示:要解决您当前的问题,不要使用String.replace,而是将您的getGuessLength 对象设为StringBuilder 并使用StringBuilder.replace(i,i,letter);

标签: java string loops replace char


【解决方案1】:

这行代码什么都不做:

go.getGuessLength().replaceAll("[^" + letter + "]", "_").charAt(i);

replaceAll() 不会修改字符串(字符串在 Java 中是不可变的)。它返回一个 new 字符串,其中的字符已被替换。你在这个新字符串上调用charAt(i),不要对这个字符做任何事情。

【讨论】:

  • 好的,我已经取得了进展(我认为)。我现在写了一个循环,将破折号更改为字母!!唯一的问题?它改变了所有这些。 -___- 所以现在当我按下按钮 A 时,如果匹配,而不是 ---,它将读取 aaa。
【解决方案2】:

replaceAll() 使用正则表达式作为替换目标。您可能只需要replace(),它仍会替换所有匹配项,但使用纯字符作为其目标。

也就是说,最简单的解决方案只是一行代码,使用replaceAll() 并将猜测的字母转换为匹配所有其他字母的正则表达式。

给定:

String word = "foo"; // the word people are trying to guess
String guesses = "one"; // the characters guessed so far

这是产生所需输出的一行代码:

String display = word.replaceAll("[^" + guesses + "]", "-");

当使用上述值执行时,display 将是-oo。

【讨论】:

  • 避免 RE 和使用 StringBuilder.replace 非常简单。
  • @HotLicks 我完全不同意:这一行在代码中表达了一行意图“用破折号替换每个尚未猜到的字母”。没有循环,没有额外的行和可能存在错误的逻辑。
  • @HotLicks 取决于您的经验 - 我可以很好地阅读它,初学者不是那么多。但是,将多行代码块视为一个“操作”有多容易理解?我认为普通的 Java 程序员需要花费大量时间来理解两者。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2010-09-16
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多