Java字符串获取空格后的字符

时间:2018-06-18 06:39:50

标签: java substring

我在尝试比较Java中的字符串时遇到了一些问题。

要比较的单词列表示例:

angry berry you young your apple orange yeast

当用户输入' y'字符,我得到的结果作为文本建议列表:

you young your yeast

此时,这是正确的。然后我进入了你'。之后还有一个空间。此时,文本建议列表不应该出来。但确实如此。然后我继续进入' b'所以' berry'应该显示为它所做的建议清单。

我不确定为什么每当我进入一个空间时,建议清单仍然显示。序列有问题。这是我的代码:

String input = editTextInput.getText().toString();

// getting text after space
String[] segments = input.split(" ");
String lastInputSegment = segments[segments.length - 1];

// if user input not null, proceed to find matching keywords
if(!lastInputSegment.equals("")) {
      // find matching keywords
      // display list of matching keywords
}

有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:5)

你使用input.split(" ")在空格上拆分,导致删除尾随空格,因此它仍然可以找到字符串。

示例:

Input: "you something"
Becomes: ["you", "something"]

因此:

Input: "you "
Becomes: ["you"]

如果您确实想保留空字符串,可以执行以下操作:

String[] segments = input.split(" ", -1);

split的负值表示不应忽略空字符串。 请注意,这会导致所有保留字词之间的空格。

答案 1 :(得分:3)

如果你想使用模式匹配作为搜索逻辑的一部分,那么正则表达式似乎是一个不错的选择。我们可以使用流和String.matches

轻松处理此问题
String input = editTextInput.getText().toString();
String[] segments = input.split(" ");
String search = "you ";

Stream<String> stream = Arrays.stream(segments);
stream.filter(s -> s.matches(search + ".*"))
    .forEach(x -> System.out.println(x));

Demo

修改

如果您想要的行为是忽略搜索字词上的所有尾随空格,无论字数多多,那么您只需在搜索字词上调用String.trim()即可:

String search = "you ";
search = search.trim();
// then use the same logic above

答案 2 :(得分:0)

您应该使用Scanner代替String.split()

try (Scanner sc = new Scanner(editInputText())) {
    while (sc.hasNext()) {
        String item = sc.next(); // add filter here
    }
}

答案 3 :(得分:0)

@Tim Biegelseisen的答案非常有效。但是你可以使用Pattern来改进它,因为String.matches()总是会创建一个模式和一个匹配器。

来自String.matches()的jdk1.8.0_131来源:

public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}

Pattern.matches()的来源:

public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

因此,通过使用以下代码段,您可以为您要迭代的每个输入字符串创建一个新的Pattern

String input = "angry berry you young your apple orange yeast";
Pattern search = Pattern.compile("you .*");   // our search pattern

Pattern.compile(" ").splitAsStream(input)     // creates a Stream<String>
    .filter(s -> search.matcher(s).matches()) // checks if string matches
    .forEach(System.out::println);