我在DART中有2个列表
列表1:选定的用户
[{'name': name1, id:'123'}, {'name': name1, id:'123'})]
清单2:所有用户
[{'name': name1, id:'123'}, {'name': name1, id:'123'}) .... (much longer)]
我想知道LIST 2中每个选定的LIST 1用户的索引。 这可能吗?
我尝试了indexWhere方法。 但是我不断收到错误消息:
error: The method 'contains' isn't defined for the class 'Map'.
答案 0 :(得分:1)
最短的解决方案是:
List<int> indices =
[for (var e1 in list1) list2.indexWhere((e2) => e1["id"] == e2["id"])];
效率不高,因为您需要对list1
中的每个元素进行线性查找。
最好为列表1中的元素创建索引,以便可以通过ID进行有效的查找。
Set<int> selectedIds = {for (var e1 in list1) e1["id"]};
List<int> indices =
[for (i = 0; i < list2.length; i++) if (selectedIds.contains(list2[i]["id"])) i];
答案 1 :(得分:0)
import 'package:enumerable/enumerable.dart';
void main() {
final selectedUsers = [
{"id": '1234', "name": "username1234"},
{"id": '8888', "name": "username8888"},
];
final allUsers = [
{"id": '1234', "name": "username1234"},
{"id": '3455', "name": "username3455"},
{"id": '2330', "name": "username2330"},
{"id": '1111', "name": "username1111"},
{"id": '8888', "name": "username8888"},
{"id": '9999', "name": "username9999"},
];
final q = selectedUsers.join$(
allUsers.select$1((e, i) => [e, i]),
(selected) => selected['id'],
(all) => all[0]['id'],
(selected, all) => all[1]);
print(q.toList());
}
结果:
[0, 4]
P.S。
如果使用元组会更清楚。但不幸的是,Dart不支持元组。
因此,将使用一个临时列表来存储索引。
答案 2 :(得分:0)
如果列表中的结构是在某些对象上定义的对象,且该对象被覆盖了等号运算符,则可以执行以下操作:
class User {
String name;
String id;
User(this.name, this.id);
@override
int get hashCode => name.hashCode ^ id.hashCode;
bool operator == (o) => name == o.name && id == o.id;
@override
toString() {
return "$name:$id";
}
}
void main() {
var list = [User("name1", "123") , User("name4", "888")];
var list2 = [User("name1", "123") , User("name2", "234"), User("name3", "666"), User("name4", "888")];
list.forEach((element) {
print(list2.indexOf(element));
});
}
这将打印出所选用户的所有索引键(在我的情况下)。也许有一个更优雅的解决方案,但它可行。使用indexWhere(),您应该能够在函数本身内部提供相等比较作为闭包,例如:
list.forEach((element) {
print(list2.indexWhere((user) => user.name == element.name && user.id == element.id));
});
这样,您可以在用户类中省略运算符和哈希码覆盖。
如果您没有课程,这也应该起作用:
void main() {
var list = [{"name": "name1", "id": "123"} , {"name": "name4", "id": "888"}];
var list2 = [{"name": "name1", "id": "123"} , {"name": "name2", "id": "234"}, {"name": "name3", "id": "666"}, {"name": "name4", "id": "888"}];
list.forEach((element) {
print(list2.indexWhere((innerElement) => innerElement["name"] == element["name"] && innerElement["id"] == element["id"]));
});
}