我在尝试比较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
}
有什么想法吗?谢谢!
答案 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));
修改强>
如果您想要的行为是忽略搜索字词上的所有尾随空格,无论字数多多,那么您只需在搜索字词上调用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);