【问题标题】:Search string in arraylist advanced (Java)高级数组列表中的搜索字符串(Java)
【发布时间】:2015-12-28 22:32:29
【问题描述】:

我使用 .equals 方法在 ArrayList 中搜索字符串,但用户必须写出字符串的确切名称。有没有办法显示与用户输入匹配的字符串? 例如,如果您搜索“Djang”并且您尝试查找的字符串是“Django”。

【问题讨论】:

  • 你可以使用正则表达式或类似String#contains
  • “字符串的名称”是什么意思?

标签: java string arraylist


【解决方案1】:

您应该查看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首先完成,或者使用映射来存储字符串和指标。
【解决方案2】:

试试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 值。

【讨论】:

  • 实际上效果很好。猜猜这也是一个菜鸟问题,我觉得我应该知道这一点,或者至少能够搜索我的答案:-)。不过感谢您的快速回答!
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2018-05-22
  • 2012-11-23
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多