00:00
了解了不可变的set类型,那接下来我们再来看一看可变的set集合是怎么样去做操作的。关于可变不可变,之前我们已经学习了array和a buffer list和list buffer,那么对于可变和不可变的set集合类型而言呢?它们之间的区别跟之前我们介绍的非常的类似,简单来讲那就是不可变的set集合。我们在做各种操作的时候,比如添加元素,合并、删除元素,那么这个时候原始的set里边的内容是不做改变的,它是不可变的,而得到的结果呢,是一个新的SS集合的对象,我们接下来要把它再付给另外的一个变量,接下来做进一步的操作。那与之对应,如果是可变的set集合类型呢?自然就应该所做的操作是直接基于之前原始的set来做更改的,接下来我们就在代码里边做一些测试,我们还是新建一个scalela的object test07,我们现在测试的是muable that面方法先写出来,首先我们要做的是创建,那这个过程其实跟之前不可变的集和创建的过程是非常类似的,我们直接可以copy过来,而且我们知道对于可变和不可变的set来讲,他们的对应的treat名称以及伴生对象的名称都是set,这个是一样的,那这里边我们默认直接这么去创建的话,当然得到的是一个不可变的集合了,那这里边如果我们想得到可变。
01:51
And,怎么办呢?它们的区别就在于所处的包不一样,所以我们要加上包名去做一个set的定义,里边我们引入的是gala.collection multipleable,那如果这里我们想要把SET1对应的类型直接写出来的话,不然也需要加上multiple上的包名,后边对应的泛型int写出来。
02:16
接下来我们可以做一个具体的测试,看一看得到结果怎么样。非常明显,得到结果跟之前不可变的集合是一样的,因为我们这里没有做任何的操作,只是把当前的set创建出来,那我们看到同样里边的元素做了一个去重处理,得到的是一个只有五个元素的set,一。接下来我们就要对SET1去做一些操作了,首先我们能想到的就是添加元素,这样我们在可变的集合类型里边添加元素的时候呢,一个set是直接调加号这样的一个方法就可以添加一个元素了,那现在对于可变的集合类型能不能调同样的方法呢?我们可以先做一个测试,F1直接加,比方说加一个11,诶我们看好像是可以调这个方法的,接下来我们看看SET1里边的内容变成了什么样。
03:17
运行之后我们会发现SET1好像没有做任何的更改啊,那所以我们就知道了可以调这个方法,但是SET1内容并不做更改,所以说明加本身这个方法应该就是不改变我们当前的集合内容的,哎,所以它不管是可变集合还是不可变集合都可以直接调,但是调完了之后呢,当前都不做改变,所以我们需要再去定义一个SAT2,获取当前得到的新的回的新的这样的一个set集合类型的对象啊,那对应的值我们打印出来。可以看到SAT2里边是添加了一个11这个新的元素啊,所以这跟我们之前不可变的set类型添加元素的过程是一样的,那现在我们是可变的类型吧,自然是希望SET1里面能直接做更改,那怎么变呢?
04:15
对于可变的集合类型而言,能调的方法就更多了,比如这里SAT1可以直接调一个哒等于,好,哎,所以这个也非常好理解啊,加如果大家类比之前我们的算数运算符的话,加上一个数,那加等于不就相当于之前我们那个赋值运算符吗?是相当于先做了一个加法,然后得到的结果再赋值给之前的那个变量,那现在不是赋值给变量了是把。添加一个元素之后得到的集合,这样的一个对象又赋给了SET1,那就相当于把SET1本身做更改了嘛。啊,接下来我们可以直接print,看看SET1是否已经发生了变化。我们看到没有问题,SET1也做了更改。
05:03
那当然了,对于有些同学来讲,可能觉得这个加和加等于这个就容易搞混啊,那有没有更加语义明确的这种调用方式呢?当然是有的,之前我们说过,推荐大家对于不可变的集合类型呢,使用这种符号的方法,而对于可变的集合类型呢,推荐大家直接调用英文名称对应的那些方法,比如这里THAT1,如果我们要挑添加元素,直接调一个at方法就可以了,哎,它的含义非常的明确,就是在SAT1里边添加嘛。Inline,我们把SET1打印出来,运行一下。可以看到当前的SET1直接就增加了一个十,哎,所以这个语义就非常的明确,推荐大家使用这种方法,其实如果大家感兴趣的话,我们可以点到里边去看看。源码底层到底是怎么实现的?我们会发现A的底层其实就是调用了一个加等于方法,所以它们本质是一样的,只不过呢,这里A还有一个返回值,一个bull类型的返回值,它到底干了一件什么事呢?这里其实就是做了一个contains判断,判断当前要添加的这个元素是否在当前的set里边。
06:21
哎,那这里大家看最后返回的结果呢,是对于这个R判断是否存在的这样一个结果,取了一个非返回了,为什么取非呢?如果这里边我们已经存在了这样一个元素的话,那因为SS集合它是有一个去虫的特性的,所以如果接下来再去添加同样的元素,那当然就相当于没有做任何操作嘛,没有效果,所以返回的就是false,当前的A没有效果,那如果要是不存在的话,这个时候添加是真正有效果的,所以返回true。其实还是非常好理解的,那这里我们可以做一个具体的测试,FLAG1用一个flag接收返回的这个板类型的值啊,再做一个打印,那接下来我们同样可以。
07:12
同样的事情再做一遍,那个二定义一个,这时候我们再一次添加十这个元素啊,最后我们可以有一行分界线,做一个打印。运行一下,看看结果怎么样。我们看到当前第一次添加时这个元素的时候,返回的是true,没有问题,添加进去了,而第二次呢,因为已经有了,所以返回false相当于没有做任何操作,这就是关于添加元素的用法。那有了添加元素,自然我们想到了还会有除元素的做法了,接下来我们要介绍的就是删除元素,删除元素这一部分其实跟添加元素非常的类似,我们直接可以把上面的内容都直接copy过来,那前面我们在不可变集合里边删除元素的时候,直接用的是减号对应的方法啊,那现在当然也可以直接用减号了,但是它同样是不改变元素的,这个我们就不再做测试了,如果要改变当前SET1的话,那当然了,这里我们直接就用减等于对应的方法就可以了,我们可以直接把它做一个。
08:27
是,那这里边S1直接减等于11,我们对应的就可以把11减掉,那同样接下来我们可以定义一个。对应的方法去删除掉值,这个元素对应于添加元素的时候用的是ADD,这里边删除元素用的就是remove,它同样底层调用的就是减等于这个方法,那同样也会返回一个bulling类型,那么它的bulling类型代表的什么含义呢?那就是如果这里边存在这个元素的话,删除可以成功,那这里边我们返回一个处,如果要是不存在的话,那相当于删除没有任何的效果,所以就返回false啊,这里边含义还是非常容易理解的,我们打印FLAG3,另外再定义一个flag次,做一个代次remove的操作。
09:19
把FLAG4做一个打印,我们可以看看结果。得到结果也非常的明显,我们可以看到第一次删除的时候。是处可以把十正常删除掉,那第二次呢,发现十已经没有了,那删除操作返回的就是false,相当于什么都没做。这就是在sat集合里边删除元素的操作。接下来我们就继续来做一下合并两个set的操作,现在我们在可变的S集合的合并操作里边,就是发现可以直接调用加加这样一个方法合并两个不可变的集合,那现在可变的集合是否也可以用相同的方式呢?呃,我这里我们先定义另外一个集合。
10:11
啊,前面我们已经定义过了SET2,那现在我们定义一个SET3。可以直接。把SET1COPY过来。这里的元素我们稍微做一些调整。我们删掉一些元素,那有一些元素呢,保留下来,另外还有一些元素可以做一个更改。29好,那接下来我们直接用SAT1去加加S3啊,那其实这个我们可以挡到啊,当前先把。SET1和SET3的一个打印。上面我们还是对于。不同的测试代码做一个分割,那么做了这个加加操作之后,再把对应的值做一个打印,我们可以看到。
11:09
SAT1SAT3完全不变啊,那当然了,如果这个时候我们把它付给另外一个SET4的话。对应的结果,我们就会想到SAT4是可以把两个集合合并在一起的。当然了,也会对它里边的元素做一个去重,哎,我们看有两个元素,十二十三是相同的,所以最后S4里边的元素一共有八个。那对于可变的集合类型而言,显然我们不希望做这样的一个操作,我们希望直接把合并之后的元素直接放在同一个集合里边,比方说S1里边要得到所有的值,那怎么样做操作呢?前面的方法非常的类似,直接加加等于S3,这样的话就可以起到相同的效果啊,比方说我们这里来做一个测试。
12:06
我们会看到SAT1跟之前的SAT4合并之后的结果就一样了,而SAT3依然保持不变,当然了,如果我们前面是SAT3加加等于SAT1的话。以后得到的结果当然就是SET1不变,SET3是合并之后的结果了,因为当前这是一个方法,调用谁调用谁改变。这就是关于可变集合的合并。
我来说两句