Java 8、整数のストリーム、整数によるストリームのインデックスのグループ化?

ダニエル

整数のストリームを取得しました。要素のインデックスを各要素の値でグループ化したいと思います。
たとえば、{1, 1, 1, 2, 3, 3, 4}は整数としてグループ化され、インデックスマッピングのリストになります。

1 -> 0, 1, 2
2 -> 3
3 -> 4, 5
4 -> 6

ストリームを使用してみましたが、クラスが追加されています。

@Test
public void testGrouping() throws Exception {
    // actually it is being read from a disk file
    Stream<Integer> nums = Stream.of(1, 1, 1, 2, 3, 3, 4);  
    // list to map by index
    int[] ind = {0};  // capture array, effectively final
    class Pair {
        int left;
        int right;

        public Pair(int left, int right) {
            this.left = left;
            this.right = right;
        }
    }

    Map<Integer, List<Integer>> map = nums.map(e -> new Pair(ind[0]++, e))
            .collect(Collectors.groupingBy(e -> e.right))
            .entrySet().parallelStream()
            .collect(Collectors.toConcurrentMap(
                    Map.Entry::getKey,
                    e -> e.getValue().parallelStream().map(ee -> ee.left).collect(Collectors.toList())
            ));
}

Stream of Integerはアプリケーションのディスクファイルから読み取られるため、Streamを読み取る必要があります。
上記のように私のやり方はかなり最適ではないと感じています。それを行うためのより良いまたはよりエレガントな方法はありますか?
ご協力いただきありがとうございます。

ホルガー

収集のための少しのヘルパー方法で:

class MapAndIndex {
    Map<Integer,List<Integer>> map=new HashMap<>();
    int index;

    void add(int value) {
        map.computeIfAbsent(value, x->new ArrayList<>()).add(index++);
    }
    void merge(MapAndIndex other) {
        other.map.forEach((value,list) -> {
            List<Integer> l=map.computeIfAbsent(value, x->new ArrayList<>());
            for(int i: list) l.add(i+index);
        } );
        index+=other.index;
    }
}

操作全体は次のようになります。

Map<Integer,List<Integer>> map = IntStream.of(1, 1, 1, 2, 3, 3, 4)
    .parallel()
    .collect(MapAndIndex::new, MapAndIndex::add, MapAndIndex::merge).map;

事前に不明なインデックスを追跡する必要がある場合は、可変状態が必要であるため、「可変リダクション」と呼ばれる操作が必要です。

ConcurrentMapここは必要ないことに注意してくださいStream実装は、すでに同時実行を処理します。MapAndIndex関連するスレッドごとに1つのコンテナーを作成しmerge、関連付けられた両方のスレッドの作業が完了すると、2つのコンテナーで操作を呼び出します。これはStream、この例のように、が順序を持っている場合、順序を保持する方法でも行われます(そうでない場合、インデックスを記録するタスクは意味がありません…)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaのラムダストリームによるグループと整数値を加算/平均

分類Dev

オプションの属性によるJava8ストリームのグループ化

分類Dev

によってグループ化Javaの8ストリームの複数

分類Dev

Java 8でのマップのリストによるグループ化

分類Dev

Java 8ストリームのグループ化

分類Dev

Java8ストリームとリストのグループ化

分類Dev

java8のストリームgroupingbyを使用した文字列のコレクションによるグループ化

分類Dev

Java 8ストリーム-タプルのストリームのグループ化

分類Dev

Java 8によるグループ化、カウント、カスタムオブジェクトへの変換

分類Dev

Java 8ストリームを使用してアイテムのリストをグループ化し、結果のマップにリストではなく最初のアイテムを入力する

分類Dev

nullグループのストリームにアクセスするときにJava 8 groupingByベースのマップを「nullセーフ」にする

分類Dev

Java 8のforループの不整合:BinaryOperatorのリストと整数のリスト

分類Dev

ストリームを使用してリストをマップ付きのインデックスに変換する方法-Java 8?

分類Dev

Java 8ストリームを使用して、リストの要素をインデックスにマップする方法は?

分類Dev

Java8-ストリームコレクターを使用してマップのリストをグループ化して合計する方法

分類Dev

オブジェクトによるグループ化-Javaストリーム

分類Dev

Javaの8ストリームに複雑なwhileループをリファクタリング

分類Dev

Javaの8、ラムダ:グループ化されたリストの中にソートし、リストにすべてのグループをマージ

分類Dev

ループコード用のJavaのリファクタリングは、Java 8のストリームAPIを使用するには

分類Dev

Java8でトークンのストリームをn-gramのストリームにマッピングする

分類Dev

Java 8並列ストリームの同時グループ化

分類Dev

ストリームを使用して複数の属性でグループ化およびソート:Java 8

分類Dev

ストリーム内のJavaグループ化

分類Dev

Javaでリスト内のアイテムをグループ化する

分類Dev

Java 8ストリームのforeachで要素のインデックスを見つける

分類Dev

Javaストリームとグループ化:オブジェクトを複数のグループに配置

分類Dev

Java8ストリームによる任意のクラスタイプの削減

分類Dev

Java8ストリームでマップされた値を持つリストのネストされたグループ化を取得する方法

分類Dev

Javaストリーム-1つの列をセットにグループ化して、データの行をより少ない行に収集します

Related 関連記事

  1. 1

    Javaのラムダストリームによるグループと整数値を加算/平均

  2. 2

    オプションの属性によるJava8ストリームのグループ化

  3. 3

    によってグループ化Javaの8ストリームの複数

  4. 4

    Java 8でのマップのリストによるグループ化

  5. 5

    Java 8ストリームのグループ化

  6. 6

    Java8ストリームとリストのグループ化

  7. 7

    java8のストリームgroupingbyを使用した文字列のコレクションによるグループ化

  8. 8

    Java 8ストリーム-タプルのストリームのグループ化

  9. 9

    Java 8によるグループ化、カウント、カスタムオブジェクトへの変換

  10. 10

    Java 8ストリームを使用してアイテムのリストをグループ化し、結果のマップにリストではなく最初のアイテムを入力する

  11. 11

    nullグループのストリームにアクセスするときにJava 8 groupingByベースのマップを「nullセーフ」にする

  12. 12

    Java 8のforループの不整合:BinaryOperatorのリストと整数のリスト

  13. 13

    ストリームを使用してリストをマップ付きのインデックスに変換する方法-Java 8?

  14. 14

    Java 8ストリームを使用して、リストの要素をインデックスにマップする方法は?

  15. 15

    Java8-ストリームコレクターを使用してマップのリストをグループ化して合計する方法

  16. 16

    オブジェクトによるグループ化-Javaストリーム

  17. 17

    Javaの8ストリームに複雑なwhileループをリファクタリング

  18. 18

    Javaの8、ラムダ:グループ化されたリストの中にソートし、リストにすべてのグループをマージ

  19. 19

    ループコード用のJavaのリファクタリングは、Java 8のストリームAPIを使用するには

  20. 20

    Java8でトークンのストリームをn-gramのストリームにマッピングする

  21. 21

    Java 8並列ストリームの同時グループ化

  22. 22

    ストリームを使用して複数の属性でグループ化およびソート:Java 8

  23. 23

    ストリーム内のJavaグループ化

  24. 24

    Javaでリスト内のアイテムをグループ化する

  25. 25

    Java 8ストリームのforeachで要素のインデックスを見つける

  26. 26

    Javaストリームとグループ化:オブジェクトを複数のグループに配置

  27. 27

    Java8ストリームによる任意のクラスタイプの削減

  28. 28

    Java8ストリームでマップされた値を持つリストのネストされたグループ化を取得する方法

  29. 29

    Javaストリーム-1つの列をセットにグループ化して、データの行をより少ない行に収集します

ホットタグ

アーカイブ