【问题标题】:Java: check if string contains more than one characterJava:检查字符串是否包含多个字符
【发布时间】:2014-12-27 17:22:16
【问题描述】:

我想用逗号检查我输入的字符串,这很容易(只需使用这个:How can I check if a single character appears in a string?)。现在我想检查一个角色是否不止一次出现。 (在本例中为逗号 (/u002C))我创建了以下代码:

public static void addTextLimiterDouble(final TextField tf, final int maxLength, final Button submitButton) {
    tf.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {

            if (oldValue.contains("\u002C") && newValue.endsWith("\u002C")) {
                tf.setText(oldValue);
            }
    }
});

这会产生 StackOverflow 错误,因为它似乎无法脱离循环。谁能解释为什么不能?

注意:我知道可能有更多方法可以检查多个字符,但我只是好奇为什么这会给我一个错误。

非常感谢任何帮助!

【问题讨论】:

    标签: java javafx contains ends-with


    【解决方案1】:

    您将侦听器添加到您的 TextField。然后覆盖changed() 方法。在这种方法中,您调用setText() !这将再次调用侦听器的changed() .... 所以你最终会陷入无限循环...

    【讨论】:

      【解决方案2】:

      想象一下您正在编辑以逗号结束的字符串的情况(实际上,这很可能是您所处的情况)。当您更改该字符串中的其他内容时,您的 if 语句 (if (oldValue.contains("\u002C") &amp;&amp; newValue.endsWith("\u002C"))) 返回 true,您尝试通过调用 tf.setText() 恢复到旧值

      然而——这改变了文本!并且您的 ChangeListener 再次被调用。新值以逗号结尾(您正在恢复为以逗号结尾的值)并且旧值也包含逗号,因此您的侦听器再次调用tf.setText()

      之后,它会调用您的ChangeListener,因为文本已更改。又一次...... 令人作呕

      【讨论】:

      • 感谢您的精彩解释!我认为 ChangeListener 只会由用户在文本字段中交替文本来调用,但这显然不是真的。
      【解决方案3】:

      String.endsWith 检查传递的String 是否存在于调用该方法的String 的末尾,但这不是您愿意做的。

      这就是我会做的:

      int index = myString.indexOf(ch);
      boolean moreThanOnce = index != -1 && index != myString.lastIndexOf(ch);
      

      但是你的测试对我来说似乎很奇怪,因为它在 oldValuenewValue 上都测试了一些东西。如果我理解你想要做什么,你应该只考虑这两者之一。

      【讨论】:

      • 感谢您的解释,以及您的替代方案。效果很好!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 2013-02-05
      • 1970-01-01
      • 2017-08-29
      • 2011-11-09
      • 2013-05-18
      相关资源
      最近更新 更多