【问题标题】:Slice a Map in Dartlang在 Dartlang 中切片地图
【发布时间】:2017-05-13 06:25:22
【问题描述】:

我需要对地图进行切片。我让它像这样工作:

Map sliceMap(Map map, offset, limit) {
  Map result = new Map();
  if (map.length < limit) {
     limit = map.length;
  }
  map.keys.toList().getRange(offset, limit).forEach((key) {
    result[key] = map[key];
  });
  return result;
}

是否有更有效的方式和/或内置方式?我在 API (https://api.dartlang.org/stable/1.21.0/dart-core/Map-class.html) 中找不到任何内容。


来自aelayeb解决方案:

Map sliceMap(Map map, offset, limit) {
  return new Map.fromIterables(
      map.keys.skip(offset).take(limit - offset),
      map.values.skip(offset).take(limit - offset)
  );
}

【问题讨论】:

  • 由于 Map 的键是不确定的,这实际上有多大用处?
  • @RandalSchwartz for Map,密钥顺序保持不变。并非所有地图都如此,例如HashMap
  • 已维护,但未定义。您不能在说“增加密钥顺序”时要求切片。因此,其中的一部分将具有未定义且相对无用的语义。可能最好退后一步,问自己“为什么我需要一片?”并找出一个不需要的不同答案。
  • @RandalSchwartz 我有一张包含 46 个项目的地图。这些项目按特定顺序设置;这个顺序永远不会改变。在我的应用程序中,我在某些情况下使用完整的地图,而在其他情况下使用它的一部分(即项目 11 到 20)。我需要“切片”和“键/值”对...
  • 仅仅因为您按特定顺序设置它们并不意味着您将按特定顺序获取它们。如果你设置了键 a、b 和 c,你可能会在按 c、a、b 的顺序迭代时得到它们。顺序将一致,尽管我们希望它在运行之间是随机的,否则您将遭受与后来修复的 Perl 中的大型安全漏洞相同的命运。

标签: dictionary dart slice


【解决方案1】:

这是我的价值方法:

new Map.fromIterables(
    map.keys.skip(offset).take(limit),
    map.values.skip(offset).take(limit)
);

这样你就不必进行极限测试了。

【讨论】:

  • 请注意,限制是相对的,因此在您的情况下,它对应于 (limit - offset)。
【解决方案2】:

你可以使用:

Map sliceMap(Map map, offset, limit) {
  return new Map.fromIterable(map.keys.skip(offset).take(limit),
      value: (k) => map[k]);
}

【讨论】:

  • 我觉得把limit的名字改成length比较准确。
猜你喜欢
  • 2018-08-18
  • 2016-05-23
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2016-11-29
  • 2021-09-27
  • 2018-06-25
相关资源
最近更新 更多