tutorial - dart vasos
¿Cómo puedo comparar las listas de igualdad en Dart? (9)
¿Funcionaría algo como esto para ti?
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren''t equal: $e");
}
Ejemplo:
main() {
List<int> list1 = [1, 2, 3, 4, 5];
List<int> list2 = new List.from(list1);
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren''t equal: $e");
}
list1.removeLast();
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("Lists aren''t equal: $e");
}
}
Impresiones de segundo intento:
Lists aren''t equal: Expect.listEquals(list length, expected: <4>, actual: <5>) fails
Estoy comparando dos listas en Dart así:
main() {
if ([1,2,3] == [1,2,3]) {
print("Equal");
} else {
print("Not equal");
}
}
Pero nunca son iguales. No parece haber un método igual () en la API de Dart para comparar listas o colecciones. ¿Hay una manera adecuada de hacer esto?
Antes de que las cosas funcionen, puedes usar esto:
/**
* Returns true if the two given lists are equal.
*/
bool _listsAreEqual(List one, List two) {
var i = -1;
return one.every((element) {
i++;
return two[i] == element;
});
}
La biblioteca de Colecciones integradas ofrece colecciones inmutables para Dart que incluyen igualdad, hash y otros objetos.
Si está haciendo algo que requiere igualdad, existe la posibilidad de que también sea mejor con la inmutabilidad.
Las colecciones en Dart no tienen igualdad inherente. Dos conjuntos no son iguales, incluso si contienen exactamente los mismos objetos que los elementos.
La biblioteca de colecciones proporciona métodos para definir tal igualdad. En este caso, por ejemplo.
IterableEquality().equals([1,2,3],[1,2,3])
Es una igualdad que considera dos listas iguales exactamente si contienen elementos idénticos.
Me topé con esto
import ''package:collection/equality.dart'';
void main(List<String> args) {
if (const IterableEquality().equals([1,2,3],[1,2,3])) {
// if (const SetEquality().equals([1,2,3].toSet(),[1,2,3].toSet())) {
print("Equal");
} else {
print("Not equal");
}
}
más información https://github.com/dart-lang/bleeding_edge/tree/master/dart/pkg/collection
Otra opción es utilizar el paquete "consultas".
import ''package:queries/collections.dart'';
void main() {
var list1 = [1, 2, 3];
var list2 = [1, 2, 3];
var col1 = new Collection(list1);
var col2 = new Collection(list2);
if (col1.sequenceEqual(col2)) {
print("Lists equal");
} else {
print("Lists not equal");
}
}
Función sequenceEqual
declarada de la siguiente manera:
bool sequenceEqual(IEnumerable<TSource> other,
[IEqualityComparer<TSource> comparer])
Esta función se puede utilizar para comparar cualquier secuencia de datos. También es posible utilizar el comparador de igualdad de datos definido por el usuario. Por defecto se utilizan comparadores integrados.
Para completar la respuesta de Gunter: la forma recomendada de comparar listas de igualdad (en lugar de identidad) es mediante el uso de las clases de igualdad del siguiente paquete
import ''package:collection/collection.dart'';
Edición : antes de 1.13, era paquete ''import: collection / equality.dart'';
P.ej,
Function eq = const ListEquality().equals;
print(eq([1,''two'',3], [1,''two'',3])); // => true
Lo anterior se imprime true
porque los elementos de lista correspondientes que son identical()
. Si desea (en profundidad) comparar listas que puedan contener otras colecciones, utilice en su lugar:
Function deepEq = const DeepCollectionEquality().equals;
List list1 = [1, [''a'',[]], 3];
List list2 = [1, [''a'',[]], 3];
print( eq(list1, list2)); // => false
print(deepEq(list1, list2)); // => true
Existen otras clases de Igualdad que se pueden combinar de muchas maneras, incluida la igualdad para los Map
. Incluso puede realizar una comparación desordenada (profunda) de colecciones:
Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals;
List list3 = [3, [[],''a''], 1];
print(unOrdDeepEq(list2, list3)); // => true
Para más detalles vea la documentación de la API del paquete . Como de costumbre, para usar dicho paquete, debe pubspec.yaml
en su pubspec.yaml
:
dependencies:
collection: any
Si bien esta pregunta es bastante antigua, la función aún no ha aterrizado de forma nativa en Dart. Necesitaba una comparación de igualdad profunda ( List<List>
), así que tomé prestado desde arriba ahora con una llamada recursiva:
bool _listsAreEqual(list1, list2) {
var i=-1;
return list1.every((val) {
i++;
if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]);
else return list2[i] == val;
});
}
Nota: esto seguirá fallando cuando se mezclen los tipos de Colección (es decir, List<Map>
) - solo cubre List<List<List>>
y así sucesivamente.
El último problema con los dardos parece ser https://code.google.com/p/dart/issues/detail?id=2217 (última actualización en mayo de 2013).
Si tienes una clase con campo de lista, como
class A {
final String name;
final List<int> list;
A(this.name, this.list);
}
y desea comparar sus instancias, puede usar el paquete equatable
class A extends Equatable {
final String name;
final List<int> list;
A(this.name, this.list) : super([name, list]);
}
y luego simplemente comparar objetos usando ==
final x = A(''foo'', [1,2,3]);
final y = A(''foo'', [1,2,3]);
print(x == y); // true