Java:检查字符串是否包含多个字符

时间:2014-10-31 11:38:07

标签: java javafx contains ends-with

我想在逗号上检查我输入的字符串,这很简单(只使用它: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错误,因为它似乎无法退出循环。谁能解释为什么它不能?

注意:我知道有更多方法可以检查多个角色,但我很好奇为什么这会给我一个错误。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

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

恢复旧值

但是 - 这会改变文字!并再次调用ChangeListener。新值以逗号结尾(您将恢复为以逗号结尾的值),旧值也包含逗号,因此您的侦听器再次调用tf.setText()

之后,它会调用您的ChangeListener,因为文本已更改。再次...... ad nauseum

答案 1 :(得分:1)

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

这就是我要做的事情:

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

然而,你的测试对我来说似乎很奇怪,因为它在oldValuenewValue上测试了一些东西。如果我很清楚你想做什么,你应该只考虑其中的一个。

答案 2 :(得分:1)

您将一个监听器添加到TextField。然后重写changed()方法。在这种方法中,你打电话给setText() !!这将再次调用听众'changed() ....所以你最终会陷入无限循环......