在字符串集合中查找相关部分
Find relevant parts in a collection of strings
我有一组路径字符串:
/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 个流媒体函数是否有简单的方法?
这是一个小窍门,我并不是说它是最佳的也不是什么都不是,但是如果没有其他选择可用,遵循这条路径可能会很有趣:
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));
你可以反转每条路径,找到这些反转字符串的前缀,并反转所述前缀以获得公共后缀。
像这样:
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[] }
如果你愿意。
我有一组路径字符串:
/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 个流媒体函数是否有简单的方法?
这是一个小窍门,我并不是说它是最佳的也不是什么都不是,但是如果没有其他选择可用,遵循这条路径可能会很有趣:
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));
你可以反转每条路径,找到这些反转字符串的前缀,并反转所述前缀以获得公共后缀。
像这样:
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[] }
如果你愿意。