2012-01-26 3 views
2

与えられる2つの配列:配列の要素の不整合部分集合を見つける - のような文字列値のJavaの

つのアレイ( a1)は、利用可能なすべての文字列値を含み、別の配列( a2)が含ま
String[] a1 = {"A", "B", "C"} 
String[] a2 = {"A", "B"}; 

値は考慮したくありません。a2に含まれていないa1の要素を持つ配列を返すにはどうしたらいいですか?

制約:
>a1 1とa2がユニーク有効な値はa2の任意の値が常にa1からの値になりますので、a1a2の間に不一致がなることはありませんつまり、常に含まれています)
2>a2することができます空の配列もここ

は私が考えているものです。

List<String> nonMatch = new ArrayList<String>(a1.length - a2.length); 
for (String a : a2) 
{ 
    if (Arrays.binarySearch(a1, a) < 0) 
    { 
      nonMatch.add(a); 
    } 
} 
return nonMatch.toArray(); 

しかし、私は任意のより良い解決策がある場合は、パフォーマンスを低下させることなく、知りたいと思った

+1

あなたはこれではないでしょうA2 – NominSim

答えて

8

私はSet<T>使用する - おそらくHashSet<T>を。例:

Set<String> results = new HashSet<String>(Arrays.asList(a1)); 
results.removeAll(Arrays.asList(a2)); 
return results; // Convert to an array if you really must 

編集:私の前の編集は、迷惑になってしまったようです。

私は個人的にを入力しないと、はあなたがそうしなければならない限り、配列に変換されません。配列ではなく、Java Collection API(ListSetMapなど)に固執すると、Javaの方が一般的に楽しくなります。たくさんの素晴らしい機能が含まれているGuavaもご覧ください。

Set<String> results = Sets.newHashSet(a1); 
results.removeAll(Arrays.asList(a2)); 
return results; 

を...しかし、一般的に、それはあなたの袖を持っているために非常に便利なライブラリです。この特定のケースでは、それは物事を改善するためにくらいしないだろう。

EDIT:LinkedHashSet<T>を使用し、秩序を維持するために:

Set<String> results = new LinkedHashSet<String>(Arrays.asList(a1)); 
results.removeAll(Arrays.asList(a2)); 
return results; // Convert to an array if you really must 
+0

あなたのアドバイスをありがとうございます。要件が変更されたため、不一致の要素の順序を維持する必要があります上記の配列a1の順序と同じです。したがって、a1 = {"A"、 "B"、 "C"、 "D"} "と" a2 = {"B"、 "C"} '結果の配列は**常に**処理のために '{" A "、" D "}'でなければなりません。もし 'Set'を使用していれば、処理の順序は維持されないでしょう。 –

+1

@ darkie15:これはあなたが使うセットに依存します。あなたは 'LinkedHashSet'を使うことができます。これは順序を保存します。 –

+0

@Donkey:無関係な質問に注意を喚起するためにコメントを使用しないでください。 –

4

私はSetはおそらく行くための最善の方法だと思います...

Set<String> diff = new HashSet<String>(Arrays.asList(a1)); 
diff.removeAll(Arrays.asList(a2)); 
+0

にすべての文字列で検索を行う必要はありませんので、その後ただ、一回反復最初の配列を並べ替えることができ現時点でコンパイルしてください(2番目のステートメントでインターフェイスをインスタンス化しようとしていますが、最初のステートメントは存在しないコンストラクタを使用しようとしています)。さらに、 'a2'からセットを作成する必要はありません。' removeAll'はどのコレクションも処理できます。 –

+0

@JonSkeet:コメントしたところで修正していた –

+0

十分に公正。あなたの編集中に、私の以前の編集が私の答えになっていたようです。( –

関連する問題