3

私は一連のパス文字列を持っています:

/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 LangStringUtils.getCommonPrefixから使用している接頭辞については。

接尾辞については、ユーティリティが見つかりませんでした(CommonsにもGuavaにもありません。後者には、正確に2つの文字列に対して1つしかありません)。そのため、Commons Lang のものと同様に、自分で作成する必要がありました。

ライブラリの 1 つでいくつかの関数を見逃した場合、または Java 8 ストリーミング関数を使用した簡単な方法があるかどうか疑問に思っています。

4

2 に答える 2

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));
于 2015-11-21T22:53:05.220 に答える
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[] }

お望みならば。

于 2015-11-21T23:01:46.500 に答える