繁体   English   中英

Dart:获取列表 2 中元素的索引(列表 1 中的元素)

[英]Dart: get index of element in list 2 (element from list 1)

我在 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'.

如果列表中的结构是定义的对象,并且覆盖了相等运算符,则可以执行以下操作:

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() 您应该能够提供相等比较作为 function 本身内部的闭包,例如:

  list.forEach((element) {
    print(list2.indexWhere((user) => user.name == element.name && user.id == element.id));
  });

有了这个,您可以省略用户 class 中的运算符和哈希码覆盖。

如果您没有 class,这也应该有效:

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"]));
  });
}

最短的解决方案是:

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];
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]

附言
如果使用元组会更清楚。 但不幸的是,Dart 不支持元组。 因此,使用一个临时列表来存储索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM