0

次のList<String>ような要素があります。

"<prefix-1>/A",
"<prefix-1>/B",
"<prefix-2>/A",
"<prefix-2>/B",
"<prefix-3>/A",
"<prefix-3>/B",

つまり、 ごとに、 、の<prefix>2 つのエントリがあります。(私のリストは既にソートされています。接頭辞の長さは異なる場合があります。)<prefix>/A<prefix>/B

プレフィックスのリストが必要です:

"<prefix-1>",
"<prefix-2>",
"<prefix-3>",

変換されたリスト内の 1 つの要素に複数の (ただし常に一定量の要素) が対応する場合、ソース リストを変換する良い方法は何ですか?

ご検討をお願いいたします

4

4 に答える 4

3

プレフィックスが常に一定の長さである場合は、それらを切り取って Set に入れることができます。

List<String> elements = // initialize here
Set<String> prefixes = new HashSet<String>();
for( String element : elements) {
    String prefix = element.substring(0,"<prefix-n>".length());
    prefixes.add(prefix);
}
// Prefixes now has a unique set of prefixes.

可変長のプレフィックスがある場合、またはより複雑な条件がある場合は、正規表現を使用して同じことを行うことができます。

于 2013-05-06T15:09:20.020 に答える
1

結果のプレフィックスの順序を変更しないソリューションを次に示します。要素は事前に並べ替えられているため、最後に取得した要素とは異なるプレフィックスが見つかるまで要素を取得し、次のように結果に新しい要素を追加できます。

List<String> res = new ArrayList<String>();
String last = null;
for (String s : src) {
    String cand = s.substring(0, s.lastIndexOf('/'));
    // initially, last is null, so the first item will always be taken
    if (!cand.equals(last)) {
        // The assignment of last happens together with addition.
        // If you think it's not overly readable, you can move it out.
        res.add(last = cand);
    }
}

これはideoneのデモです。

于 2013-05-06T15:08:27.577 に答える
0

構造的に類似した要素の数が常に同じである場合は、リストの先頭をループしてこの数を見つけ、要素をスキップして残りを構築します。

于 2013-05-06T15:09:37.530 に答える