Обычно, если у вас есть что-то похожее:
var accumulator: A = new A
for( b <- collection ) {
accumulator = update(accumulator, b)
}
val result = accumulator
можно преобразовать во что-то вроде:
val result = collection.foldLeft( new A ){ (acc,b) => update( acc, b ) }
Так что здесь мы можем сначала использовать карту, чтобы форсировать уникальность флагов.,Предположим, что флаг имеет тип F:
val result = listOfTuples.foldLeft( Map[F,(ClassA,ClassB)] ){
( map, tuple ) => map + ( tuple._1.flag -> tuple )
}
Затем оставшиеся кортежи могут быть извлечены из карты и преобразованы в список:
val uniqList = map.values.toList
Он сохранит последний принятый кортеж,если вы хотите сохранить первое, замените foldLeft
на foldRight
, а инвертируйте аргумент лямбды .
Пример:
case class ClassA( flag: Int )
case class ClassB( value: Int )
val listOfTuples =
List( (ClassA(1),ClassB(2)), (ClassA(3),ClassB(4)), (ClassA(1),ClassB(-1)) )
val result = listOfTuples.foldRight( Map[Int,(ClassA,ClassB)]() ) {
( tuple, map ) => map + ( tuple._1.flag -> tuple )
}
val uniqList = result.values.toList
//uniqList: List((ClassA(1),ClassB(2)), (ClassA(3),ClassB(4)))
Редактировать: Если вам нужно сохранить порядок первоначального списка, используйте вместо этого:
val uniqList = listOfTuples.filter( result.values.toSet )