flutter Set集合妙用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter Set集合妙用相关的知识,希望对你有一定的参考价值。

参考技术A

Set是不能重复的集合,所以可以用Set去重;

String、int、double类型示例,如下:
String类型:

int类型:

double类型:

可以看到, Set集合可直接对String、int、double类型去重
Map、List、bool类型和String、int、double类型对比示例,如下:

可以看到,当自定义对象实例化为同一个对象时,Set会过滤掉同一个实例化的对象;当自定义对象实例化为不同对象时,Set不会去重,即使对象数据内容一样,这不符合我们的业务;

可以看到,重写自定义对象==方法,Set还是不能去重;

上面重写自定义对象hashCode和==方法,以title不同区分不同对象;
可以看到,重写自定义对象hashCode和==方法,Set集合对自定义对象去重才有效;并且Set集合里有相同对象时(相同对象为上面自定义对象title值相同的对象),后面相同的对象就不会被加入Set集合里了( 如上面title一样,boolValue不一样,这样被认为相同的对象,因为重写自定义对象hashCode和==方法,以title不同区分不同对象;Set集合里最开始加入的TestModel(\'a\', boolValue: false),数据不会被相同对象TestModel(\'a\', boolValue: true)覆盖 )。

网上介绍flutter Set集合时一般会介绍Set没有顺序,这点不太理解,可能是不能通过索引来获取对应的值吧,像Java语言的Set集合确实是无序的,但flutter的Set集合保持着子元素的有序性。 如下:

可以看到,将Set通过toList()方法转为List后,List里子元素的顺序和子元素插入Set集合的顺序是一致;对于自定义对象亦是如此,可自行验证。
为什么Set集合会保持子元素插入顺序呢
我们看下Set源码,如下:

从源码我们可知,Set()是一个工厂构造方法,根据工厂构造方法的特点,Set是由LinkedHashSet实例化的。

从上面注释可知,HashSet是无序的,LinkedHashSet保持着子元素插入的顺序。而Set是由LinkedHashSet实例化的,所以Set保持着子元素插入的顺序。
如想要深入分析LinkedHashSet,LinkedHashSet源码中有很多external声明的方法,可参考 如何找到flutter external声明方法的实现

demo传送门

以上是关于flutter Set集合妙用的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin集合操作 ④ ( Set 集合 | 可变 Set 集合 | List 与 Set 之间相互转换 | 数组类型 )

Kotlin集合操作 ④ ( Set 集合 | 可变 Set 集合 | List 与 Set 之间相互转换 | 数组类型 )

set集合关于set与set进行比较

java集合-Set集合

集合类Set\Map

Python基础数据类型之set集合