1

私は集合交差点について尋ねるコードイーバルで練習問題をやっています。サイトが入力と出力を期待する方法は、もう少し複雑にするために意図的に複雑になっていると思います。

問題の特定の部分は、2 つのセット (実際には文字列の配列、正確な問題はhttp://codeeval.com/open_challenges/30/にあります) を取り、それらの交点を見つけ、コンマ区切りで順番に出力します。TreeSet を使用して解決しましたが、少し複雑で複雑すぎるため、正規表現を使用して少しきれいにしようとしています。

私はこれを見つけました -

String common = bothSets[0].replaceAll("[^" + bothSets[1] + "]", "");

スタックオーバーフローに関する別の質問。先頭のコンマが残りますが、これを修正しようとしました

int subIndex = 0;
while(common.charAt(subIndex) == ',')
    subIndex++;

System.out.println(common.substring(subIndex, common.length()));

小さな文字列サイズやヌル文字列サイズなどのエッジケースを除いて機能し、その後爆発しました。正規表現を修正してwhileループを完全に回避する方がきれいだと思いますが、上記の正規表現に「先頭のコンマを削除」する方法がわかりません。

最後に、私の元の解決策はここにあります - http://pastebin.com/10NuBevB - 正規表現のアプローチのような代替案を検討するのは正しいですか、私はそのペーストビンコードに特に満足していません.まだ。

どんな方向でも大歓迎です。

4

3 に答える 3

3

TreeSets とメソッドを使用retainAllすることは、実際の交点を計算するためのおそらく最も明確な方法です。2 つの元の文字列に対して 2 つの正規表現マッチャーを並行して実行することで (入力セットが既に並べ替えられていることがわかっているという事実を利用して) 巧妙なことを行うこともできますが、それは最適化が行き過ぎている可能性があります。コードを最適化する必要があることを (プロファイリングから) 知っている。

私の唯一のコメントは、出力を生成するためのコードがかなり複雑であることです。ポストエディットではなく、自分で出力を構築するのはどうですかtoString:

Iterator<String> iter = a.iterator();
if(iter.hasNext()) {
  // first entry with no comma
  System.out.print(iter.next());
}
while(iter.hasNext()) {
  // subsequent entries with a preceding comma
  System.out.print(",");
  System.out.print(iter.next());
}
System.out.println();
于 2012-08-30T11:21:51.463 に答える
1

私があなたの問題を理解している限り、次のような文字列があります。

[1, 2, 3,4]

そして、あなたはそれを次のように見せたいです:

1,2,3,4

この正規表現を試してください - すべての[ , ]スペースに一致します:

String common = bothSets[0].replaceAll("(\\[|\\]| )", "");
于 2012-08-30T11:16:07.440 に答える
1

TreeSet バージョンのバリアント:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class MyTest {

    public static List<String> getDuplicates(List<String> dups) {
        final List<String> result = new ArrayList<String>();
        Set<String> set = new TreeSet<String>() {
            public boolean add(String s) {
                if (contains(s)) {
                    result.add(s);
                }
                return super.add(s);
            }
        };
        for (String t : dups) {
            set.add(t);
        }
        return result;
    }

    public static void main(String[] args) {

        String input = "7,8,9;8,9,10,11,12";
        String numbers = input.replace(';', ',');
        List<String> elements = Arrays.asList(numbers.split(","));

        System.out.println(getDuplicates(elements)); //[8, 9]

    }
}

リストに重複が含まれていないと仮定します。

于 2012-08-30T11:39:35.027 に答える