简单Map:
Map map = Map<int, String>{};
我可以填充它:
map = {1: 'c', 2: 'dart', 3: 'flutter'};
这里我需要指定一个密钥。我想知道如何获得自动密钥。
我不能使用map.lenght,因为每当我删除第二个项目(2)时,第三个项目将保持为3,map.lenght将覆盖该键。
作为@eamirho3ein的回答,我尝试了以下方法:
//& Maps
Map map = <int, Ingredient>{};
Map<int, T> addToMap<T>(Map<int, T> map, T newItem) {
var list = map.entries.map((e) => e.value).toList();
list.add(newItem);
var newIndex = 1;
return Map.fromIterable(list,
key: (item) => newIndex++, value: (item) => item);
}
Map<int, Ingredient> result = addToMap<Ingredient>(
map, //Error here
Ingredient(
name: "Pizza",
kcal: 100,
carbohydrates: 50,
proteins: 35,
lipids: 23,
fibers: 12,
date: DateTime.now(),
bottomTabIndex: 0,
leftTabIndex: 0));
但我在Map上收到此错误(已指明):
参数类型'Map〈dynamic,dynamic〉'无法指派给参数类型'Map〈int,Ingredient〉'。
这是我的简单类:
class Ingredient {
String? name;
int? kcal;
int? carbohydrates;
int? proteins;
int? lipids;
int? fibers;
int? leftTabIndex;
int? bottomTabIndex;
DateTime? date;
Ingredient(
{this.name,
this.kcal,
this.carbohydrates,
this.proteins,
this.lipids,
this.fibers,
this.leftTabIndex,
this.bottomTabIndex,
this.date});
}
5条答案
按热度按时间xsuvu9jc1#
您可以使用此函数移除Map中的项目并自动生成新密钥:
您可以这样使用它:
如果要添加新项目:
这样命名它:
nukf8bse2#
你可以使用一个递增的
index
键,它在每次调用时总是与其他键不同,并将它 Package 在一个autoKey()
方法中,如下所示:cotxawn73#
也许我应该使用一个函数:
并在我向Map添加内容时使用它:
{getNewKey(Map):'c',getNewKey(Map):' dart ',getNewKey(Map):“ Flutter ”}
请让我知道这是错误的:-|
通过这种方式,我永远不会覆盖一个密钥,只有增量。
请注意:我不应该直接使用
因为如果Map为空会产生错误。
a6b3iqyw4#
如果您有一个使用连续的、基于整数的密钥的
Map
,您应该问问自己是否应该使用List
,这样您就不需要自己管理密钥了。如果由于某些API需要而必须使用
Map
,您仍然可以从List
开始,然后使用List.asMap
轻松地转换它:请注意,
List.asMap
返回一个 unmodifable 视图,因此如果希望允许变异,则需要创建一个副本:如果必须让您的
Map
键是从1开始的整数,而不是0,则您可以插入一个伪元素(如果需要,稍后再移除它):pqwbnv8z5#
另一种方法是使用
class
作为密钥,而使用hashCode
则永远不等于其自身,如下所示:这里我重写了
hashCode
,所以它总是0
,然后我重写了==
运算符,所以如果对象有不同的hashCode
,它们可以相等,这是不可能的,因为0!=0
总是false
。即使您使用相同的
class
构造函数,它们也永远不会相同,因此,它允许您根据需要使用它,而无需为在Map
上执行的每个操作处理它