显示没有重复/重复的地图列表- Dart

  • 本文关键字:列表 Dart 地图 显示 dart
  • 更新时间 :
  • 英文 :


我试图显示/打印没有重复元素的地图列表。例如:

List userList = [
{'name': 'john', 'user_id': '251'},
{'name': 'will', 'user_id': '255'},
{'name': 'jack', 'user_id': '251'} // duplicate
];

这就是我要输出的内容/print

List userList = [
{'name': 'john', 'user_id': '251'},
{'name': 'will', 'user_id': '255'},
];

有些人可能会建议使用toSet方法,但这只适用于列表(不是map的列表)

这就是为什么我们不应该在Dart中使用映射作为数据结构的原因之一,因为它使表达元素彼此相等的含义变得相当复杂。

所以我建议通过创建这样的User类来解决这个问题:

class User {
String name;
String user_id;
User({required this.name, required this.user_id});
@override
int get hashCode => user_id.hashCode;
@override
bool operator ==(Object other) => other is User && user_id == other.user_id;
@override
String toString() => '{Name: $name, User ID: $user_id}';
}
class User {
String name;
String user_id;
User({required this.name, required this.user_id});
@override
int get hashCode => Object.hash(name, user_id);
@override
bool operator ==(Object other) =>
other is User && name == other.name && user_id == other.user_id;
@override
String toString() => '{Name: $name, User ID: $user_id}';
}

这样做,我们可以:

void main() {
List<User> userList = [
User(name: 'john', user_id: '251'),
User(name: 'will', user_id: '255'),
User(name: 'jack', user_id: '251'),
];
userList.forEach(print);
// {Name: john, User ID: 251}
// {Name: will, User ID: 255}
// {Name: jack, User ID: 251}
}

然后我们可以这样做toSet()的技巧:

void main() {
List<User> userList = [
User(name: 'john', user_id: '251'),
User(name: 'will', user_id: '255'),
User(name: 'jack', user_id: '251'),
];
List<User> uniqueUserList = userList.toSet().toList();
uniqueUserList.forEach(print);
// {Name: john, User ID: 251}
// {Name: will, User ID: 255}
}

我注意到你的例子是这样做的,所以你只看user_id来确定你是否有一个重复的元素。我不知道你的例子是否错了,但如果你想比较nameuser_id,你的类看起来像这样:

class User {
String name;
String user_id;
User({required this.name, required this.user_id});
@override
int get hashCode => Object.hash(name, user_id);
@override
bool operator ==(Object other) =>
other is User && name == other.name && user_id == other.user_id;
@override
String toString() => '{Name: $name, User ID: $user_id}';
}

最后,如果你真的想用Map对象来解决这个问题,你可以用下面的方法来解决,在这里你创建一个Set,用你自己的定义来定义相等的含义:

void main() {
List<Map<String, String>> userList = [
{'name': 'john', 'user_id': '251'},
{'name': 'will', 'user_id': '255'},
{'name': 'jack', 'user_id': '251'} // duplicate
];
final set = LinkedHashSet<Map<String, String>>(
equals: (map1, map2) {
final id1 = map1['user_id'];
final id2 = map2['user_id'];
return id1 != null && id2 != null && id1 == id2;
},
hashCode: (map) => map['user_id'].hashCode,
);

set.addAll(userList);

List<Map<String, String>> uniqueUserList = set.toList();
uniqueUserList.forEach(print);
// {name: john, user_id: 251}
// {name: will, user_id: 255}
}

还有其他方法可以解决这个问题,但它总是会变得有点难看,因为Map不是用于前面描述的数据结构的。

相关内容

  • 没有找到相关文章

最新更新