【发布时间】:2015-12-28 22:32:29
【问题描述】:
我使用 .equals 方法在 ArrayList 中搜索字符串,但用户必须写出字符串的确切名称。有没有办法显示与用户输入匹配的字符串? 例如,如果您搜索“Djang”并且您尝试查找的字符串是“Django”。
【问题讨论】:
-
你可以使用正则表达式或类似
String#contains -
“字符串的名称”是什么意思?
我使用 .equals 方法在 ArrayList 中搜索字符串,但用户必须写出字符串的确切名称。有没有办法显示与用户输入匹配的字符串? 例如,如果您搜索“Djang”并且您尝试查找的字符串是“Django”。
【问题讨论】:
String#contains
您应该查看Levenshtein Distance。它测量一个字符串与另一个字符串的距离。甚至还有a Java implementation in Wikibooks。
然后,就是排序和找到最小值的问题。
list.stream()
.sort(Comparator.comparing(
s -> LevenshteinDistance.computeLevenshteinDistance(s, input))
.findFirst();
从那里,还可以进行过滤以添加可接受距离的上限,以防止所有输入返回结果。
list.stream()
.sort(Comparator.comparing(
s -> LevenshteinDistance.computeLevenshteinDistance(s, input))
.filter(s -> LevenshteinDistance.computeLevenshteinDistance(s, input) < limit)
.findFirst();
【讨论】:
LevenshteinDistance 是个好点。但我认为工具不是那么好。通过在comparing 中直接使用LevenshteinDistance.computeLevenshteinDistance,这种代价高昂的方法将被调用更多次。也许这可以通过.filter首先完成,或者使用映射来存储字符串和指标。
试试String.contains() 方法
public boolean contains(CharSequence s) 当且仅当返回 true 此字符串包含指定的 char 值序列。
参数: s - 要搜索的序列
返回: 如果此字符串包含 s,则为 true,否则为 false
抛出: NullPointerException - 如果 s 为空
因为: 1.5
例如:
String myString = "Django"
public boolean stringCatcher(String userInput) {
return myString.contains(userInput);
}
然后将Djang 传递给stringCatcher() 将导致返回true 值。
【讨论】: