5

並べ替え/フィルタリングする必要のあるアイテム(つまり文字列)のリストがあります。

最終結果には重複(簡単)が含まれていてはなりませ。すべてをセットに入れます。だから私は今文字列のセットを持っています。

詳細説明..

また、2つの文字列間の差の量を計算するメソッドxもあります(レーベンシュタイン距離を使用)。

質問:

新しい文字列stringをセットに挿入する前に、との間の他の文字列との間のメソッドを使用してレーベンシュタイン距離setを確認し、それを追加しないでください。xstringsetx>=3

これを行うための私のベストショットは何ですか?setそれぞれが挿入されるトラフを繰り返すことを除いてstring

4

3 に答える 3

2

可能性を狭めるのに役立つ組み込みの実装がないため、を繰り返すSetことが最善の策になります。Set

于 2012-05-23T16:24:57.477 に答える
2

私はそれをどのように行うかという私の考えで遊んできました。何回も繰り返さずにこれを行う方法を考えることはできません。

distance(String,String):int2つの文字列間の指定された距離を返すという名前のメソッドがあるとします。

String x = "Obi-wan"; //this is the item subject to eval addition
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
if (items.filter(s -> distance(s, x) >= 3).getFirst() == null) {
  items.add(x);
}

JDK8プレビューを使用する場合は、上記のコードを使用してすぐにこれを行うことができます。Iterables.getFirst()メソッドはコレクション全体を反復処理しませんが、基準を満たす最初の要素が見つかるまで反復処理します。

それ以外の場合は、おそらく述語インターフェースとフィルタリングメソッドを実装する必要があります。

interface Predicate<T> {
    public boolean eval(T o);
}

public static void main(String[] args) {
   final String x = "Obi-wan"; //this is the item subject to eval addition
   List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
   Predicate<String> p = new Predicate<String>() {
       public boolean eval(String s){ 
           return distance(s, x) >= 3;
       }
   };
   if(filter(items, p).isEmpty()){ 
        items.add(x);
   }
}

public static <T> List<T> filter(List<? extends T> items, Predicate<? super T> predicate){
    List<T> destiny = new ArrayList<T>();
    for(T item : items){
       if(predicate.eval(item){
           destiny.add(item);
       }
    }
    return destiny;
}

または、基準を満たす最初のアイテムが見つかったら、フィルタリングを停止することもできます。

于 2012-05-23T16:48:59.557 に答える
1

セットを作成するときにカスタムコンパレータを使用できます。コンパレータでは、2つの文字列が同じである場合(通常の文字列比較ルールに従って)、またはレーベンシュタイン距離が基準を満たしている場合、2つの文字列が同じであることが返されます。

コマペレーターが2つの文字列が同じであると言った場合、新しい文字列はセットに挿入されません。(これは、文字列の最終結果が挿入の順序に依存する可能性があることを意味することに注意してください)

更新:全順序に関するコメントへの対処:

上記のようなコンパレータを使用すると、使用されるレーベンシュタイン距離基準が全順序を定義しないため、他のソリューションと同様に、最終結果が挿入の順序に依存するようになります(上記のとおり)。

OTOH、文字列が等しくないテストに合格してセットに挿入されると、セット内の他の文字列はこれと同じになることはないため、セット内の文字列は、全順序を定義する自然な文字列の順序を使用します。したがって、セットの内部操作(ソートなど)内でそれ以上の不整合は発生しません。

于 2012-05-23T16:32:12.443 に答える