2016-10-10 7 views
1

に収集:。)は(ストリームを使用して2つのリストから構成さマップの作成例えば、二つのリストがあるのでJavaの

ストリームを使用して
List<Double> list1 = Arrays.asList(1.0, 2.0); 
List<String> list2 = Arrays.asList("one_point_zero", "two_point_zero"); 

、リスト1である場合、私は、これらのリストで構成マップを作成したいですキーの場合はlist2は値の場合です。これを行うには、私は、補助リストを作成する必要があります。ここでは

List<Integer> list0 = Arrays.asList(0, 1); 

はマップです:

Map<Double, String> map2 = list0.stream() 
       .collect(Collectors.toMap(list1::get, list2::get)); 

リスト0は、注文リスト1で使用されている:: getとlist2の::仕事に取り掛かります。 list0を作成しないと簡単な方法がありますか?私は、次のコードを試してみましたが、それはうまくいきませんでした:

Map<Double, String> map2 = IntStream 
       .iterate(0, e -> e + 1) 
       .limit(list1.size()) 
       .collect(Collectors.toMap(list1::get, list2::get)); 
+0

答えが見つかった:私はStream.iterate使用している必要があります(0、Eは - > E + 1)の代わりにIntStream.iterateの(0、E - > E + 1) – sva605

+1

ので、あなたがすることができます近い質問 –

+0

も参照してくださいhttp://stackoverflow.com/questions/17640754/zipping-streams-using-jdk8-with-lambda -java-util-stream-streams-zip –

答えて

4

代わりにインデックスを保持するための補助リストを使用して、あなたはIntStreamによってそれらを生成させることができます。

Map<Double, String> map = IntStream.range(0, list1.size()) 
      .boxed() 
      .collect(Collectors.toMap(i -> list1.get(i), i -> list2.get(i))); 
4

これは私のために動作しますが、O(N^2)である:

Map<Double, String> collect = 
      list1.stream() 
        .collect(
          toMap(Double::doubleValue, 
            item -> list2.get(list1.indexOf(item)))); 
1

確かに最善のアプローチは、get(index)で両方のリストの各要素にアクセスし、最終的にはリストが完全に同じサイズではない場合IndexOutOfBoundsExceptionを避けるためにMath.min(a, b)を使用するためにはIntStream.range(startInclusive, endExclusive)を使用することで、最終的なコード次のようになります。

Map<Double, String> map2 = IntStream.range(0, Math.min(list1.size(), list2.size())) 
    .boxed() 
    .collect(Collectors.toMap(list1::get, list2::get)); 
関連する問題