首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在不复制地图的情况下过滤地图?

问有没有办法在不复制地图的情况下过滤地图?
EN

Stack Overflow用户
提问于 2022-07-13 22:42:05
回答 1查看 115关注 0票数 1

我必须过滤这张地图:

代码语言:javascript
复制
Map<int, String> example = <int,string>{
100 : 'Flutter'
200 : 'SUPERFLUTTER'
300 : 'dart'
}

如果筛选器参数为“dart”我的筛选器函数必须返回以下内容,则筛选器只应返回具有筛选器参数的条目:

代码语言:javascript
复制
Map<int, String> output = <int,string>{
300 : 'dart'
}

我使用这个函数来过滤:

代码语言:javascript
复制
Map<int,String> filterdMap (Map<int,String> input, String filter) {
return Map.from(input)
    ..removeWhere(
      (key, value) => !value.toLowerCase().contains(filter),
    );
}

这是可行的,但我相信我是复制了不必要的地图。有没有其他方法可以解决这一问题而不重复地图?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-14 09:22:44

您希望创建一个新的映射,它只包含满足某种标准的现有映射的条目。在这种情况下,标准仅仅是关于值的。

我同意,复制整个地图,只是为了删除一些条目后,似乎不必要的昂贵。不是及时的,它在输入中仍然是线性的,但是如果大多数条目最终被删除,那么内存的使用就会过度。

有一种非常直接的办法:

代码语言:javascript
复制
Map<int, String> filtered = {};
input.forEach((k, v) {
  if (v.toLowerCase().contains(filter)) {
    filtered[k] = v;
  }
});
// done.

这是一个完全有效的方法。有些人更喜欢基于流程和功能的方法,但这并不一定更好或更有效率。

如果我想把它作为一条直线来做,我会处理条目:

代码语言:javascript
复制
var filtered = Map.fromEntries(input.entries.where((e) =>
    e.value.toLowerCase().contains(filter)));

通过过滤条目,而不仅仅是值,您可以保留键和值,这样您就可以从它构建一个映射。

这也和:

代码语言:javascript
复制
var filtered = {for (var e in input.entries) 
    if (e.value.toLowerCase().contains(filter)) e.key: e.value};

正如@jamesdlin所暗示的,但实际上我更喜欢非文字语法,因为它不需要我提到键。(如果不运行实际的基准测试,我也不会尝试预测哪种方法更快。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72973390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档