我想要的是从dart中的两个List类型中获取所有匹配和不匹配的项目。所以假设我有一个列表a和列表B,我如何获得一个差异,比如列表c。下面是我目前遇到的问题。
var a = [ {"id":"1","b":"2"}, {"id":"2","d":"4"}, {"id":"3","f":"6"} ]; var b = [ {"id":"1","b":"2"}, {"id":"3","d":"6"} ];
如何获得列表c的差异:
c = [{"id":"2","d":"4"}]
4urapxun1#
你可以比较如下:对于不匹配的记录为:
var c= a.where((e)=>b.where((ee)=>e['id']==ee['id']).toList().isEmpty).toList();
匹配记录为:
var c= a.where((e)=>b.where((ee)=>e['id']==ee['id']).toList().isNotEmpty).toList();
cigdeys32#
我不确定我是否理解得很好,但这将是我的第一个方法。时间复杂度不是最好的,它可能可以优化。当我确信这是你要找的东西时,我可能会尝试做这件事。
typedef mapList = List<Map<String, String>>; mapList substractMaps(mapList a, mapList b) { mapList difference = []; a.forEach((aMap){ final currentIdValue = aMap['id']; bool found = false; b.forEach((bMap) { if(bMap['id'] == currentIdValue) { found = true; } }); if(!found) { difference.add(aMap); } }); return difference; }
b4lqfgs43#
您有两个Map列表,您要取其差异。最快的解决方案是将这两个列表转换为不可变Map的集合,这些Map可以正确地用作集合键,然后取集合的差异。就像这样:
import 'package:fast_immutable_collections/fast_immutable_collections.dart'; void main(List<String> arguments) { final a = [ {"id": "1", "b": "2"}, {"id": "2", "d": "4"}, {"id": "3", "f": "6"} ]; final b = [ {"id": "1", "b": "2"}, {"id": "3", "d": "6"} ]; final aSet = a .map( (e) => IMap(e), ) .toSet(); final bSet = b .map( (e) => IMap(e), ) .toSet(); print( aSet.difference(bSet).toList(), ); }
这导致:
[{ id: 2, d: 4 }, { id: 3, f: 6 }]
这似乎是你想要的。更新:不完全。您没有指定{"id":"3","d":"6"}会发生什么。我把它作为这些集合的一个区别。你需要澄清你的问题。
{"id":"3","d":"6"}
3条答案
按热度按时间4urapxun1#
你可以比较如下:
对于不匹配的记录为:
匹配记录为:
cigdeys32#
我不确定我是否理解得很好,但这将是我的第一个方法。时间复杂度不是最好的,它可能可以优化。当我确信这是你要找的东西时,我可能会尝试做这件事。
b4lqfgs43#
您有两个Map列表,您要取其差异。最快的解决方案是将这两个列表转换为不可变Map的集合,这些Map可以正确地用作集合键,然后取集合的差异。就像这样:
这导致:
这似乎是你想要的。
更新:不完全。您没有指定
{"id":"3","d":"6"}
会发生什么。我把它作为这些集合的一个区别。你需要澄清你的问题。