2016-11-30 5 views
1

私の配列内の要素が他の配列に含まれているかどうかを調べようとしています。このためにネストされたforループを使用したくないので、なぜ私の.containsが機能しないのか不思議です。2つの配列をArrays.containsで比較しようとしています。Java

は現在、私は、2つの配列

double [] s2 = new double [4]; 
double [] match = new double [s2.length]; 

を持っていると私は私の match配列に s2は、値のいずれかが含まれているかどうかをテストしようとしています

for (j = 0; j < s2.length; j++) 
     { 
      if(Arrays.asList(s2).contains(match[j])){ 
       return true; 
      } 
     } 

これは二重のデータ型とは何かを持っています使っています?もし私がまだ使用できる方法があれば.contains

+0

http://stackoverflow.com/a/30251235/1553851 – shmosel

+0

どれ具体的な理由あなたドンネストされたループを使用したくないのですか? – shmosel

+0

あなたはネストされたループを使用しています。間接的に 'contains'を使っているだけです(各パスで' s2'の新しいリストラッパーを作成しています)。 – chrylis

答えて

2

。別のオブジェクトを作成するのではなく、2番目のforループのリストを繰り返し処理する必要があります。


差が最小であるべきであるが、それは、代わりに、ループを使用するStream操作()を用いて行うことができます。ストリームの詳細については

DoubleStream.of(s2)  // Pipe the source array 
    .distinct()   // Remove duplicate elements 
         // as they only need to be matched against once 
    .anyMatch(value -> // Consider if any value matches this condition 
     IntStream.of(match) // It equals any value in "match" 
       .distinct() // after removing duplicate elements 
       .anyMatch(matchValue -> matchValue == value)); 

- これらのOracleの記事を参照:処理データのJava SE 8つのストリームPart 1とし、Part 2

1

問題がArrays.asList(s2)の場合、期待通りにList<Double>オブジェクトが返されません。

List<double[]>オブジェクトを返します。したがって、その配列内の要素はdouble[]の型になります。

Genericsはプリミティブ型ではうまく機能しません。

解決策はdouble[]Double[]に変換することです。 Arrays.asListがあなたの要素のListを作成するだけで一つの値のListしません:要素(インデックス0)のごdouble[]特定の問題に対処する

+0

解決策として、ユーザは '配列を使うべきです。 asList'。 – Unihedron

+0

@Unihedron動作しませんでした。 asListはそのように 'double []'を受け入れません。コンパイルエラー: – Thihara

+0

ああ、あなたが正しいです、私はパラメータが適応するだろうと思って間違っていた。私の悪い! – Unihedron

関連する問題