当我将相同的项目添加到集合中时,如果该项目包含列表,它将被复制。
例如:
main() {
print('equales ${Foo([]) == Foo([])}');
Set<Foo> set = {};
set.add(Foo([]));
print("set.length = ${set.length}");
set.add(Foo([]));
print("set.length = ${set.length}");
}
class Foo {
List<int> ints;
Foo(this.ints);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Foo &&
runtimeType == other.runtimeType &&
listEquals(ints, other.ints);
@override
int get hashCode => ints.hashCode;
}
输出:
equales true
set.length = 1
set.length = 2
最佳答案
您的代码是正确的,但是每次您将新的List []传递给Set时都使用不同的哈希码。而不是检查列表的哈希码,而是使用枚举类检查相等性。
main() {
print('equales ${Foo([]) == Foo([])}');
print('list -> ${[] == []}');
Set<Foo> set = {};
set.add(Foo([], fooType: FooType.HAPPY));
print("set.length = ${set.length}");
set.add(Foo([], fooType: FooType.HAPPY));
print("set.length = ${set.length}");
set.add(Foo([], fooType: FooType.SAD));
print("set.length = ${set.length}");
}
class Foo {
List<int> ints;
FooType fooType;
Foo(this.ints, {this.fooType});
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Foo &&
runtimeType == other.runtimeType &&
listEquals(ints, other.ints);
@override
int get hashCode => fooType.hashCode;
}
enum FooType { HAPPY, SAD }
输出:
equales true
list -> false
set.length = 1
set.length = 1
set.length = 2
希望它会有用
关于flutter - 集添加重复的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57741917/