Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections 在Dart中克隆列表、地图或集合_Collections_Dart_Clone - Fatal编程技术网

Collections 在Dart中克隆列表、地图或集合

Collections 在Dart中克隆列表、地图或集合,collections,dart,clone,Collections,Dart,Clone,来自Java背景:推荐的“克隆”Dart列表、地图和集合的方法是什么?在Java中使用clone(),既棘手又有问题1,2。实际上,clone()是一个复制构造函数,为此,Dart列表、映射和集类型都有一个名为.from()的执行复制的构造函数;e、 g.鉴于这些声明 Map nummons,moreboons; nummons=const{‘火星’:2,‘木星’:27}; 列出行星,更多的行星; 您可以像这样使用.from(): moreMoons=newmap.from(nummons)

来自Java背景:推荐的“克隆”Dart
列表
地图
集合
的方法是什么?

在Java中使用
clone()
,既棘手又有问题1,2。实际上,
clone()
是一个复制构造函数,为此,Dart
列表
映射
类型都有一个名为
.from()
的执行复制的构造函数;e、 g.鉴于这些声明

Map nummons,moreboons;
nummons=const{‘火星’:2,‘木星’:27};
列出行星,更多的行星;
您可以像这样使用
.from()

moreMoons=newmap.from(nummons)
…addAll({'Saturn':53});
行星=新的列表.from(nummons.keys);
morePlanets=新列表。来自(行星)
…加上(“冥王星”);
请注意,
List.from()
通常接受迭代器,而不仅仅是
List

为了完整起见,我应该提到
dart:html
节点
类定义了一个方法


1 J.布洛赫,“有效Java”第二版,第11项。
2.参考文献3。文章引述:

如果你读过我书中关于克隆的内容,特别是如果你读过字里行间的内容,你就会知道我认为克隆已经被彻底破坏了---布洛赫


3.

给出的答案是好的,但是要注意
生成
构造函数,如果您想“增加”固定长度列表,它会很有帮助,例如:

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);
}
List List=新列表(5);
int-depth=0;//用于跟踪我们使用的索引的变量
...
深度++;
如果(list.length index
对于深度复制(克隆),您可以使用:

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

但是可能会对性能产生一些担忧。

此解决方案应该可以:

列表列表1=[1,2,3,4];
List list2=list1.map((element)=>element.toList();

这是一个列表,但对于地图等也应该是一样的。记住,如果列表和集合的末尾是一个列表,请添加到列表中,我通常使用

List<String> clone = []..addAll(originalList);
List clone=[]…addAll(原始列表);
正如@kzhdev提到的,需要注意的是
addAll()
from()

[不要]真的复制。他们在新地图/列表/集合中添加了一个引用

这对我来说通常没问题,但我会记住的。

贴图。from()仅适用于1D贴图

在dart中复制无参考的多维地图,请使用以下方法


地图复制深度地图(地图地图)
{
Map newMap={};
弗雷奇地图
(
(关键、价值)
{
newMap[键]=(值为Map)?copyDeepMap(值):值;
}
);
返回newMap;
}
我的最佳解决方案:

List temp = {1,2,3,4}
List platforms = json.decode(json.encode(parent.platforms));

如果您使用的是dart>2.3.0,则可以使用如下排列运算符:

List<int> a = [1,2,3];
List<int> b = [...a]; // copy of a
列表a=[1,2,3];
列表b=[…a];//副本

这是我的解决方案。我希望它能帮助别人

  factory Product.deepCopy(Product productToCopy) => new Product(
    productToCopy.id,
    productToCopy.title,
    productToCopy.description,
    productToCopy.price,
    productToCopy.imageUrl,
    productToCopy.isFavorite,
  );}


有了新版本的dart,地图或列表的克隆变得非常容易。 您可以尝试使用此方法对列表和地图进行深度克隆

名单

List a = ['x','y', 'z'];
List b = [...a];
地图

Map mapA = {"a":"b"};
Map mapB = {...mapA};
布景

Set setA = {1,2,3,};
Set setB = {...setA};
我希望有人觉得这有帮助。

复制地图过滤

 var filteredNewCopy = filtered.map((key, value) => MapEntry(key, [...value]));

Josh Bloch实际上参与了Dart collections API的一些早期设计。.from()和.addAll()并不是真正的克隆。他们在新地图/列表/集合中添加了一个引用。例如:map1={'one':{'name':1},'two':{'name':2},'three':[{'a':{'a':1,'B':2},'B':{'a':3,'B':4}]};Map map2=新的Map.from(map1);map2['two']['name']=4;在更改map2['two']['name']之后,map1也发生了更改
.from()
是一个浅复制构造函数。为了澄清,我从未说过
.from()
执行了克隆操作。我写的是
clone()
是一种复制构造函数。请记住,如果您知道原始
List
的类型,
List.of()
可能更好。我不完全理解为什么这个回复被否决,因为它确实有一些优势。是的,会有一些性能问题,但它确实会复制内部列表,而不仅仅是复制到它们的链接。所以我向上推一句,只有在只有基本属性的情况下,你的答案才有效。假设您有getter/setter/functions。json.decode->encode将打破这一切,dude@qiAlex这很明显,但这是一种可以选择的方式,伙计。很多时候,当您想要克隆和复制包含基本体的对象时。克隆一个函数意味着什么!如果在要复制的列表/映射/集中使用DateTime,则此操作无效。请注意,这不会克隆对象列表。该列表将包含引用。这是一个浅复制。不幸的是,它将返回一个列表,因此它在工作时不能用于集合。谢谢亲爱的:)这对Set有效吗?@funder7是的,这对Set也有效。集合set1={1,2,3,};集合s={…集合1};但是我尝试使用它,但我得到了一个错误:{…set1}正在返回一个列表!我做错了什么?或者它是一个测试版功能?我用的是马厩channel@funder7当我在dartpad中运行相同的代码时,它工作得很好。看这里哇,超级简单。谢谢