2016-08-11 4 views
2

Обычно я вызываю отдельный список для удаления дубликатов или превращения его в Set. Теперь у меня есть List[MyObject]. MyObject случай класс, смотрите ниже:Как сделать список [CaseObj] отличным от свойства CaseObj?

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

Допустим, мы имеем следующие случаи:

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) 

два вопроса:

  1. Как я могу подсчитать, сколько объектов затронуты? Дубликаты основаны на содержании s2?
  2. Как я могу сделать Список отдельным на основе s2? Я бы рассмотрел два объекта корпуса одинаково, когда s2 == s2. Нужно ли превращать класс case в нормальный класс и переопределять равные? Нужен ли мне собственный компаратор для этого или я могу использовать какой-либо метод Scala API для его архивации?
+2

Это два вопроса, и их следует разделить таким образом. # 1 мне непонятно. # 2 является дубликатом http://stackoverflow.com/questions/3912753/scala-remove-duplicates-in-list-of-objects –

+0

Вопрос 1 означает: как узнать, сколько объектов MyObject имеют одинаковый контент в s2 no вопрос, что находится в s1 или s3. Я просто обожаю s2 здесь. Вопрос 2 означает: я просто хочу сохранить единственный объект MyObject с s2. Меня не волнует, какой из них. Полученный список должен быть разным, основываясь на свойстве класса case s2. Итак, myList сверху будет иметь только 2 записи после преобразования. – user3350744

ответ

5

Как я могу подсчитать, сколько объектов затронуто? Дубликаты основаны на содержании s2?

Если вы хотите, чтобы подсчитать, сколько объектов в каждом дубликате группы (если вы хотите знать, сколько объектов будут удалены, вычитает 1 из размера):

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) 

Как я могу сделать Список отдельным на основе 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))