查找字符串集合中的相关部分

时间:2015-11-21 22:41:44

标签: java java-8 apache-commons-lang3

我有一组路径字符串:

/content/example-site/global/library/about/contact/thank-you.html
/content/example-site/global/corporate/about/contact/thank-you.html
/content/example-site/countries/uk/about/contact/thank-you.html
/content/example-site/countries/de/about/contact/thank-you.html
/content/example-site/others/about/contact/thank-you.html
...

(路径通常比这长得多)

正如您所看到的,很难立即注意到这些差异。这就是为什么我要强调字符串中的相关部分。

要查找差异,我目前正在计算所有字符串的公共前缀和后缀:

String prefix = getCommonPrefix(paths);
String suffix = getCommonSuffix(paths);
for (String path : paths) {
    String relevantPath = path.substring(prefix.length(), path.length() - suffix.length());
    // OUTPUT: prefix + "<b>" + relevantPath + "</b>" + suffix
}

对于前缀我正在使用来自 Commons Lang StringUtils.getCommonPrefix

对于后缀,我找不到实用程序(既不在 Commons 也不在 Guava 中,后者只有一个用于两个字符串)。所以我必须自己编写 - 类似于Commons Lang的那个。

我现在想知道,如果我错过了其中一个库中的某些功能 - 或者 如果Java 8流媒体功能有一个简单的方法吗?

2 个答案:

答案 0 :(得分:3)

这是一个小小的黑客攻击,我不是说它是最优的,也没有什么,但如果没有其他选择,可以采用这条路径:

String[] reversedPaths = new String[paths.length];
for (int i = 0; i < paths.length; i++) {
    reversedPaths[i] = StringUtils.reverse(paths[i]);
}
String suffix = StringUtils.reverse(StringUtils.getCommonPrefix(reversedPaths));

答案 1 :(得分:0)

您可以反转每个路径,找到这些反转字符串的前缀并反转所述前缀以获得通用后缀。
像这样:

String commonSuffix = new StringBuffer(getCommonPrefix(paths.stream().map(path -> new StringBuffer(path).reverse().toString()).collect(Collectors.toList()))).reverse().toString();

我个人不太喜欢这个解决方案,因为你为列表中的每个路径创建了一个新的StringBuffer。这就是java有时会工作的方式,但如果对性能没有危险,那至少是丑陋的。你可以写自己的功能

public static String invert(String s) { // invert s using char[] }

如果你愿意的话。