2016-08-11 1 views
2

Habituellement, j'appelle distinct sur Liste pour supprimer les doublons ou le transformer en Set. Maintenant, j'ai un List[MyObject]. MyObject est une classe de cas, voir ci-dessous:Comment faire une liste [CaseObj] distincte basée sur une propriété de CaseObj?

case class MyObject(s1: String, s2:String, s3:String) 

Disons que nous avons les cas suivants:

val myObj1 = MyObject("", "gmail,com", "some text") 
val myObj2 = MyObject("", "gmail,com", "") 
val myObj3 = MyObject("some text", "gmail.com", "") 
val myObj4 = MyObject("some text", "gmail.com", "some text") 
val myObj5 = MyObject("", "ymail.com", "") 
val myObj6 = MyObject("", "ymail.com", "some text") 

val myList = List(myObj1, myObj2, myObj3, myObj4, myObj5, myObj6) 

Deux questions:

  1. Comment puis-je compte combien d'objets sont affecté? Duplicats basés sur le contenu de s2?
  2. Comment distinguer la liste en fonction de s2? Je considérerais deux cas de même cas quand s2 == s2. Ai-je besoin de transformer la classe de cas en une classe normale et remplacer les équivalents? Ai-je besoin d'un propre comparateur pour cela ou puis-je utiliser une méthode API Scala pour archiver le même?
+2

Voici deux questions qui devraient être divisées de cette façon. # 1 n'est pas clair pour moi. # 2 est un doublon de http://stackoverflow.com/questions/3912753/scala-remove-duplicates-in-list-of-objects –

+0

La question 1 signifie: Comment voir combien d'objets MyObject ont le même contenu dans s2 non importe ce qui est en s1 ou s3. Je me soucie juste de s2 ici. La question 2 signifie: Je veux juste garder un seul MyObject avec s2. Je me fiche de savoir lequel. La liste résultante doit être distincte en fonction de la propriété de classe de cas s2. Donc, myList d'en haut aurait juste 2 entrées après la transformation. – user3350744

Répondre

5

Comment puis-je compter le nombre d'objets affectés? Duplicats basés sur le contenu de s2?

Si vous voulez compter le nombre d'objets dans chaque groupe en double (si vous voulez seulement savoir comment vont être supprimés de nombreux objets, soustraire 1 de la taille):

myList.groupBy(_.s2).map(x => (x._1, x._2.size)) 
res0: scala.collection.immutable.Map[String,Int] = Map(ymail.com -> 2, gmail.com -> 2, gmail,com -> 2) 

Comment puis-je faire la liste distincte basée sur s2?

myList.groupBy(_.s2).map(_._2.head) 
res1: scala.collection.immutable.Iterable[MyObject] = List(MyObject(,ymail.com,), MyObject(some text,gmail.com,), MyObject(,gmail,com,some text))