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
Dart中不同的Map实现之间有什么区别?_Dart - Fatal编程技术网

Dart中不同的Map实现之间有什么区别?

Dart中不同的Map实现之间有什么区别?,dart,Dart,Dart有一个映射类型,其实现类似于、和。这些不同的地图实现之间有什么区别?Dart内置了对列表、集合和地图等集合的支持。Dart有不同的映射实现。了解实施之间的利弊有助于您做出明智的决策 (注意:这是在Dart M3期间编写的,因此下面的内容可能与当前的文档不匹配。) 什么是地图? 映射是一个关联容器,将关键点映射到值。键是唯一的,并且只能指向一个值。键不能为null,但值可以为null 映射文字 Dart支持,如下所示: var账户={'323525':'John Smith','58898

Dart有一个映射类型,其实现类似于、和。这些不同的地图实现之间有什么区别?

Dart内置了对列表、集合和地图等集合的支持。Dart有不同的映射实现。了解实施之间的利弊有助于您做出明智的决策

(注意:这是在Dart M3期间编写的,因此下面的内容可能与当前的文档不匹配。)

什么是地图? 映射是一个关联容器,将关键点映射到值。键是唯一的,并且只能指向一个值。键不能为null,但值可以为null

映射文字 Dart支持,如下所示:

var账户={'323525':'John Smith','588982':'Alice Jones'};
规范规定映射文字必须保持插入顺序。这意味着
accounts
LinkedHashMap
的一个实例

该规范还规定映射文字键必须是字符串。这在将来可能会改变

新地图() Dart支持工厂构造函数,因此您可以创建一个新的Map实例,如下所示:

var accounts=newmap();
Map
类是抽象的,这意味着工厂构造函数实际上创建了
Map
子类的实例。那么,
账户的实际类型是什么呢

Dart的早期版本从
new Map()
构造函数创建了
HashMap
的新实例。但是,声明为了使
{}
新映射
返回相同的类型,
新映射
将很快返回
LinkedHashMap
的实例

LinkedHashMap(或插入OrderedMap)
LinkedHashMap
以插入键和值的相同顺序迭代键和值

注意:LinkedHashMap可能会重命名为InsertionOrderedMap。跟随进步

以下是一个例子:

导入“dart:collection”;
main(){
var ordered=新LinkedHashMap();
有序['32352']='Alice';
有序['95594']='Bob';
for(有序.keys中的变量键){
打印(键);
}
//保证打印32352,然后打印95594
}
这是你的电话号码。(如果此链接停止工作,可能是因为该类已重命名)

哈希图 HashMap不能保证保持插入顺序。在遍历HashMap的键或值时,不能期望有特定的顺序

HashMap是使用

以下是创建新HashMap的示例:

导入“dart:collection”;
main(){
var accounts=newhashmap();
}
如果您不关心维护插入顺序,请使用HashMap

这是你的电话号码

八字树地图 splay树是一种自平衡的二叉搜索树,具有附加属性,最近访问的元素可以快速再次访问。它在O(log(n))摊销时间内执行插入、查找和删除等基本操作

导入“dart:collection”;
main(){
var accounts=新的SplayTreeMap();
}
SplayTreeMap要求所有键的类型相同

对于经常存储和访问的数据(如缓存),splay树是一个很好的选择。原因是他们使用树旋转将元素带到根,以便更频繁地访问。性能来自树的自优化。也就是说,频繁访问的元素会移到更靠近顶部的位置。但是,如果在所有地方访问该树的次数相同,那么使用splay树贴图就没有什么意义了


例如,调制解调器路由器以极高的速率接收网络数据包。调制解调器必须决定哪个数据包进入哪条线路。它可以使用map实现,其中键是IP,值是目的地。对于这种情况,splay树映射是一个很好的选择,因为大多数IP地址将被多次使用,因此可以从树的根目录中找到这些地址。

还有一种替代方法

多重映射

import 'package:quiver/collection.dart';

algorithms() {
  var ordered = new ListMultimap();
  ordered.add('32352', 'Alice');
  ordered.add('95594', 'Bob');
  ordered.add('32352', 'Alice2');

  for (var key in ordered.keys) {
    print(key);
  }

  for (var value in ordered.values) {
    print(value);
  }

  // print in ascending order
  // flutter: 32352
  // flutter: 95594
  // flutter: Alice
  // flutter: Alice2
  // flutter: Bob
}

有关省道图的关键注意事项

import 'package:quiver/collection.dart';

algorithms() {
  var ordered = new ListMultimap();
  ordered.add('32352', 'Alice');
  ordered.add('95594', 'Bob');
  ordered.add('32352', 'Alice2');

  for (var key in ordered.keys) {
    print(key);
  }

  for (var value in ordered.values) {
    print(value);
  }

  // print in ascending order
  // flutter: 32352
  // flutter: 95594
  // flutter: Alice
  // flutter: Alice2
  // flutter: Bob
}
Dart
Map
是键值对的集合。它将每个键映射到一个值。我们可以在地图上迭代

根据迭代的顺序,有三种类型的映射:

  • HashMap
    是无序的。稍后出现的键值对可以先订购
  • LinkedHashMap
    按插入顺序具有可预测的迭代顺序。稍后出现的键值对将稍后排序
  • SplayTreeMap
    按排序顺序迭代键。它是一个自平衡的二叉树,频繁访问的元素将更靠近树的根
默认情况下,使用
Map
构造函数
(Map()
Map.from()
Map.of())
创建实例将返回
LinkedHashMap

无论我们在哪里使用
Map
,您都可以考虑
LinkedHashMap
,也可以用
LinkedHashMap
替换Map

在Dart/FLIFT中创建新地图

使用new关键字,我们可以创建一个新的
地图

在使用这些语法之前,不要忘记导入dart:collection library,这些语法包含
HashMap
LinkedHashMap
SplayTreeMap
,以及本答案其余部分中的其他代码

import 'dart:collection';

main() {
  HashMap hashMap = new HashMap<int, String>();
  LinkedHashMap linkedHashMap = new LinkedHashMap<int, String>();
  SplayTreeMap treeMap = new SplayTreeMap<int, String>();
}
在上面的代码中,我们指定键值对的类型:
您还可以声明
映射
LinkedHashMap
SplayTreeMap
,而无需设置其键和值的类型。这是什么意思?它不会限制我们在地图中添加

这些映射现在接受其他类型:

Map map = Map();
HashMap map1 = HashMap();
LinkedHashMap map2 = LinkedHashMap();
SplayTreeMap map3 = SplayTreeMap();

更多:

要向八字树添加更多内容:它们用于将元素置于顶部以获得更好的频率