Java Lambda创建一个带有谓词函数的过滤器,该函数确定Levenshtein距离是否大于2



>我有一个查询来获取最相似的值。好吧,我需要定义最小列文施泰因距离结果。如果分数大于 2,我不希望将该值视为建议的一部分。

String recommendation =  candidates.parallelStream()
            .map(String::trim) 
            .filter(s -> !s.equals(search))
            .min((a, b) -> Integer.compare(
              cache.computeIfAbsent(a, k -> StringUtils.getLevenshteinDistance(Arrays.stream(search.split(" ")).sorted().toString(), Arrays.stream(k.split(" ")).sorted().toString()) ),
              cache.computeIfAbsent(b, k -> StringUtils.getLevenshteinDistance(Arrays.stream(search.split(" ")).sorted().toString(), Arrays.stream(k.split(" ")).sorted().toString()))))
            .get();

您的问题是关于一个单一的过滤操作:如何排除分数高于 2 的元素。你需要为它写一个谓词。在不知道有关应用程序逻辑其余部分的任何详细信息的情况下可以编写的最简单谓词形式如下:

.filter(s -> StringUtils.getLevenshteinDistance(search, s) <= 2)

考虑到您将 Levenshtein 分数缓存在HashMap中,谓词应该这样重写:

.filter(s -> cache.computeIfAbsent(s, k -> StringUtils.getLevenshteinDistance(search, k)) <= 2)

现在,如果你想对元素做任何其他事情,比如拆分、重新排序和连接它们,你可以进一步增强这段代码,但这超出了你的问题的范围。

尽管如此,说到拆分/连接,让我纠正您的代码中的一个错误。该行

Arrays.stream(search.split(" ")).sorted().toString()

并没有真正做任何有用的事情。它只会打印流实例的哈希代码。我猜你想完成这个:

Arrays.stream(s.split(" ")).sorted().collect(Collectors.joining(" "))

此代码将按字母顺序对单词链重新排序:"Malus Casus" -> "Casus Malus"

最新更新