我试图显示/打印没有重复元素的地图列表。例如:
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
来确定你是否有一个重复的元素。我不知道你的例子是否错了,但如果你想比较name
和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}';
}
最后,如果你真的想用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
不是用于前面描述的数据结构的。