Collections 在Dart中克隆列表、地图或集合
来自Java背景:推荐的“克隆”DartCollections 在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中使用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中运行相同的代码时,它工作得很好。看这里哇,超级简单。谢谢