Как определить, содержит ли двумерный список другой список, не используя вложенные циклы for?
Я ищу метод, похожий на in в python. Я пытался использовать list.contains(x), но, похоже, он не идентифицирует списки:
List a = [[1,2],[1,1],[2,2]];
List b = [1,2];
int c = 1;
b.contains(c) // returns true
a.contains(b) // returns false
По умолчанию dart сравнивает высокоуровневые объекты со ссылками, но вам нужно сравнение на основе значений, поскольку коллекции являются высокоуровневыми объектами. collection пакет имеет методы равенства для этого случая. Пример:
import 'package:collection/collection.dart';
void main() async {
final element = [1, 2];
final b = [
[1, 2] // equal values with element but not referenced
];
final c = [element];
print(b.contains(element)); // prints false
print(c.contains(element)); // prints true
for (final e in b) {
print(ListEquality().equals(e, element)); // prints true
}
}
Обновлено: приведенное выше решение теперь полезно для Dart-only приложений. Если вы разрабатываете приложение Flutter, у него появилось несколько новых методов:
listEquals для списков: https://api.flutter.dev/flutter/foundation/listEquals.html
mapEquals для Карт: https://api.flutter.dev/flutter/foundation/mapEquals.html
setEquals для наборов: https://api.flutter.dev/flutter/foundation/setEquals.html
Итак, в нашем примере решение:
import 'package:flutter/foundation.dart';
print(b.any((e) => listEquals(e, element))); // prints true