web-dev-qa-db-ja.com

Dartでリスト、マップ、またはセットを複製する

Javaバックグラウンドから来る:Dart ListMapおよびSetを「クローン」するための推奨される方法は何ですか?

49
Patrice Chalin

Java=でのclone()の使用はトリッキーで疑わしい1,2。事実上、clone()はコピーコンストラクターであり、そのために、Dart ListMap、およびSetタイプにはそれぞれ があります。名前付きコンストラクタ.from()という名前で、 浅いコピーを実行します ;例えばこれらの宣言を考えると

_  Map<String, int> numMoons, moreMoons;
  numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
  List<String> planets, morePlanets;
_

次のように.from()を使用できます。

_  moreMoons = new Map<String,int>.from(numMoons)
    ..addAll({'Saturn' : 53 });
  planets = new List<String>.from(numMoons.keys);
  morePlanets = new List<String>.from(planets)
    ..add('Pluto');
_

List.from()は、Listだけでなく、より一般的にイテレータを受け入れることに注意してください。

完全を期すため、_Dart:html_ Nodeクラスは clone() メソッドを定義していることを述べておきます。


1 J. Bloch、「Effective Java」第2版、アイテム11。
2 B。 Venners、「Josh Bloch on Design:Copy Constructor vs Cloning」、2002 。ここから参照。記事からの引用:

私の本でクローンについての項目を読んだ場合、特に行間を読んだ場合、クローンが深く壊れていると思います。 --- J.Bloch

Dart問題#6459、クローンインスタンス(オブジェクト)

41
Patrice Chalin

リストとセットの場合、私は通常、

_List<String> clone = []..addAll(originalList);
_

@kzhdevが言及しているように、警告はaddAll()およびfrom()です。

実際にはクローンを作成しないでください。新しいマップ/リスト/セットに参照を追加します。

通常は問題ありませんが、覚えておきます。

7
mr.musicman

このソリューションは機能するはずです。

リストlist1 = [1,2,3,4];

リストlist2 = list1.map((element)=> element).toList();

リスト用ですが、マップなどでも同じように機能するはずです。最後にリストがある場合は、リストに追加してください。

2
CodeMemory

Map.from()多次元マップの1Dマップでのみ機能します


    Map<keyType, valueType> copyDeepMap( Map<keyType, valueType> map )
    {
        Map<keyType, valueType> newMap = {};

        map.forEach
        (
            (key, value)
            {
                newMap[key] =( value is Map ) ? copyDeepMap(value) : value ;
            }
        );

        return newMap;
    }

0
Manish Dhruw

与えられた答えは良いですが、固定長のリストを「拡張」したい場合に役立つgenerateコンストラクタに注意してください。例:

List<String> list = new List<String>(5);
int depth = 0; // a variable to track what index we're using

...
depth++;
if (list.length <= depth) {
  list = new List<String>.generate(depth * 2,
      (int index) => index < depth ? list[index] : null,
      growable: false);
}
0
Dan Field

ディープコピー(クローン)の場合、次を使用できます。

Map<String, dynamic> src = {'a': 123, 'b': 456};
Map<String, dynamic> copy = json.decode(json.encode(src));

ただし、パフォーマンスについて懸念がある場合があります。

0
karianpour

私にとって最適なソリューションList temp = {1,2,3,4} List platforms = json.decode(json.encode(parent.platforms));

0
Serg