1

パッケージディレクトリを表す文字列のリストがあります。リストを繰り返して、パッケージが同じである文字列の最大部分を見つけ、このサブ文字列を抽出し、元の文字列リストからそれを差し引いて特定のパッケージを取得し、適切なディレクトリを作成します。

元のリストを静的ハッシュセットとして作成し、retainAllメソッドを使用して、結果を新しい文字列に格納することを考えていました。

このようなものが最もパフォーマンスの高いオプションでしょうか、それともそれを行うためのより良い方法がありますか?

どうもありがとう

4

3 に答える 3

1

これは私にとってはうまくいきます、コメントで説明します

// returns the length of the longest common prefix of all strings in the given array 
public static int longestCommonPrefix(String[] strings) {
    // Null or no contents, return 0
    if (strings == null || strings.length == 0) {
        return 0;
        // only 1 element? return it's length
    } else if (strings.length == 1 && strings[0] != null) {
        return strings[0].length();
        // more than 1
    } else {
        // copy the array and sort it on the lengths of the strings,
        // shortest one first.
        // this will raise a NullPointerException if an array element is null 
        String[] copy = Arrays.copyOf(strings, strings.length);
        Arrays.sort(copy, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length() - o1.length();
            }
        });
        int result = 0; // init result
        // iterate through every letter of the shortest string
        for (int i = 0; i < copy[0].length(); i++) { 
            // compare the corresponding char of all other strings
            char currenChar = copy[0].charAt(i);
            for (int j = 1; j < strings.length; j++) {                  
                if (currenChar != copy[j].charAt(i)) { // mismatch
                    return result;
                }
            }
            // all match
            result++;
        }
        // done iterating through shortest string, all matched.
        return result;
    }
}

元の配列を変更しても問題ない場合は、行String[] copy = Arrays.copyOf(strings, strings.length);を省略して配列を並べ替えることができますstrings

テキストを取得するには、戻り値の型を に変更し、ループ内およびメソッドの最後などでString何かを返します。return copy[0].substring(0, result + 1);return copy[0];

于 2012-10-26T11:39:51.130 に答える
0

最も一般的な単一のパッケージを探している場合は、次のようにします。

リストから最初の要素を取得します(これを参照パッケージと呼びます)。このパッケージ名を使用して、リストを繰り返し処理します。リストの残りの要素ごとに、要素に参照パッケージが含まれているかどうかを確認します。その場合は、次の要素に移動します。そうでない場合は、参照パッケージを1つのパッケージでトリミングします(取得してaa.bb.cc.serversideに変換しaa.bb.ccます)。次に、現在の要素にこの新しい参照パッケージが含まれているかどうかを確認します。参照パッケージが空になるまで、または要素が一致するまで、これを繰り返します。次に、パッケージのリストを続けます。

これにより、最も一般的な最大のパッケージが提供されます。リスト内のすべての要素からこれを削除することをループバックします。

編集:わずかな変更.。完全なパッケージ名を確保するために、パッケージ名の末尾をより適切に保持してください。

于 2012-10-26T11:32:08.900 に答える
0

それらを並べ替えるだけです。一般的なプレフィックスが最初に表示されます。

于 2012-10-26T20:17:44.050 に答える