日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scala从集合中提取不重复的元素

發布時間:2024/1/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scala从集合中提取不重复的元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Problem

????你有一個集合,內部有很多重復元素,你想要把這些重復的元素只保留一份。

Solution

????使用Distinct方法:

scala>?val?x?=?Vector(1,?1,?2,?3,?3,?4) x:?scala.collection.immutable.Vector[Int]?=?Vector(1,?1,?2,?3,?3,?4)scala>?val?y?=?x.distinct y:?scala.collection.immutable.Vector[Int]?=?Vector(1,?2,?3,?4)

????這個distinct方法返回一個新的集合,重復元素只保留一份。記得使用一個新的變量來指向這個新的集合,無論你使用的是mutable集合還是immutable集合。

????如果你突然需要一個set,那么直接吧你的集合轉化成為一個set也是去掉重復元素的方式:

scala>?val?s?=?x.toSet s:?scala.collection.immutable.Set[Int]?=?Set(1,?2,?3,?4)

????因為Set對于一樣的元素只能保存一份,所以把Array,List,Vector或者其他的集合轉化成Set可以去掉重復元素。實際上這就是distinct方法的工作遠離。Distinct方法的源代碼顯示了他就是實用了一個mutable.HashSet的實例。

Using distinct with your own classes

????要想對你自己定義的集合元素類型使用distinct方法,你需要實現equals和hashCode方法。舉個例子,下面這個類就可以使用disticnt方法,因為我們實現了這兩個方法:

class?Person(firstName:?String,?lastName:?String)?{override?def?toString?=?s"$firstName?$lastName"def?canEqual(a:?Any)?=?a.isInstanceOf[Person]override?def?equals(that:?Any):?Boolean?=?{that?match?{case?that:?Person?=>?that.canEqual(this)?&&?this.hashCode?==?that.hashCodecase?_?=>?false}}override?def?hashCode:?Int?=?{val?prime?=?31var?result?=?1result?=?prime?*?result?+?lastName.hashCoderesult?=?prime?*?result?+?(if(firstName?==?null)?0?else?firstName.hashCode)return?result} }scala>?class?Person(firstName:?String,?lastName:?String)?{|???override?def?toString?=?s"$firstName?$lastName"|???def?canEqual(a:?Any)?=?a.isInstanceOf[Person]|???override?def?equals(that:?Any):?Boolean?=?{|?????that?match?{|???????case?that:?Person?=>?that.canEqual(this)?&&?this.hashCode?==?that.hashCode|???????case?_?=>?false|?????}|???}|???override?def?hashCode:?Int?=?{|?????val?prime?=?31|?????var?result?=?1|?????result?=?prime?*?result?+?lastName.hashCode|?????result?=?prime?*?result?+?(if(firstName?==?null)?0?else?firstName.hashCode)|?????return?result|???}|?} defined?class?Personobject?Person?{def?apply(firstName:?String,?lastName:?String)?=?new?Person(firstName,?lastName) }scala>?object?Person?{|???def?apply(firstName:?String,?lastName:?String)?=?new?Person(firstName,?lastName)|?} defined?module?Person

????接下來我們定義幾個Person對象的實例,并測試distinct方法:

scala>?val?dale1?=?new?Person("Dale",?"Cooper") dale1:?Person?=?Dale?Cooperscala>?val?dale2?=?new?Person("Dale",?"Cooper") dale2:?Person?=?Dale?Cooperscala>?val?ed?=?new?Person("Ed",?"Hurley") ed:?Person?=?Ed?Hurleyscala>?val?list?=?List(dale1,?dale2,?ed) list:?List[Person]?=?List(Dale?Cooper,?Dale?Cooper,?Ed?Hurley)scala>?val?uniques?=?list.distinct uniques:?List[Person]?=?List(Dale?Cooper,?Ed?Hurley)

總結

以上是生活随笔為你收集整理的scala从集合中提取不重复的元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。