Определите, содержит ли 2D-список список в Dart/Flutter

Как определить, содержит ли двумерный список другой список, не используя вложенные циклы 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
3
0
2 452
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию 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

Другие вопросы по теме