Scala 如何从元组创建对象列表,然后按最小属性选择对象?

Scala 如何从元组创建对象列表,然后按最小属性选择对象?,scala,Scala,作为我的标题中的问题,如何从元组列表中创建对象列表,然后通过最小属性从对象列表中选择最小值以返回其索引 我有一个元组列表,为此我创建了两个case类: case class Animal(typeA: String, name: String, months: Int) case class Animals(animals: List[Animal]) List((Hero, Dog, 8), (Ninja, Cat, 17), (Kitty, Cat, 12), (Snoop, Lion,

作为我的标题中的问题,如何从元组列表中创建对象列表,然后通过最小属性从对象列表中选择最小值以返回其索引

我有一个元组列表,为此我创建了两个case类:

case class Animal(typeA: String, name: String, months: Int)
case class Animals(animals: List[Animal])

List((Hero, Dog, 8), (Ninja, Cat, 17), (Kitty, Cat, 12), (Snoop, Lion, 3) ... )
如何将此列表转换为所需的输出:

Animals(Animal(Hero, Dog, 8), Animal(Ninja, Cat, 17), Animal(Kitty, Cat, 12), Animal(Snoop, Lion, 3) ... )
我可以通过解析JSON文件并使用flatMap和asOpt方法轻松地完成这项工作,该方法将我的元组转换为动物:

animals = feature._1.properties.flatMap(_.asOpt[Animals])
但正如我在上面所描述的使用JSON解析时,我的元组在一个列表中,所以我尝试了这个方法,但没有成功:

val raw_Animals = List((Hero, Dog, 8), (Ninja, Cat, 17), (Kitty, Cat, 12), (Snoop, Lion, 3) ... )
var animals : Animals[List[Animal]] = raw_Animals.flatMap(_.asOpt[Animal])
val ages = animals.map(animal => animal._3.toInt).toList
val minAge = ages.min
val index = animals.indexWhere(_._3 == minAge)
println(animals(index))

我欣赏任何方法。

您可以使用
.tuple
如下:

case class Animal(typeA: String, name: String, months: Int)
case class Animals(animals: List[Animal])
val raw_Animals = List(("Hero", "Dog", 8), ("Ninja", "Cat", 17))

Animals.tupled(raw_Animals.map(Animal.tupled))
// -> Animals(List(Animal(Hero,Dog,8), Animal(Ninja,Cat,17)))

您可以像这样使用
.tuple

case class Animal(typeA: String, name: String, months: Int)
case class Animals(animals: List[Animal])
val raw_Animals = List(("Hero", "Dog", 8), ("Ninja", "Cat", 17))

Animals.tupled(raw_Animals.map(Animal.tupled))
// -> Animals(List(Animal(Hero,Dog,8), Animal(Ninja,Cat,17)))

我觉得你的列表[Animal]的动物包装器有点不必要,因为你必须调用.Animals来获取基础集合,但这应该可以实现你想要的。您可以利用该函数将元组映射到
Animal
并使用Collections函数按年龄查找最小的元组:

scala>   val raw_Animals = List(("Hero", "Dog", 8), ("Ninja", "Cat", 17), ("Kitty", "Cat", 12), ("Snoop", "Lion", 3))
raw_Animals: List[(String, String, Int)] = List((Hero,Dog,8), (Ninja,Cat,17), (Kitty,Cat,12), (Snoop,Lion,3))

scala>   val animals = Animals(raw_Animals.map(Animal.tupled))
animals: Animals = Animals(List(Animal(Hero,Dog,8), Animal(Ninja,Cat,17), Animal(Kitty,Cat,12), Animal(Snoop,Lion,3)))

scala>   val ages = animals.animals.map(_.months)
ages: List[Int] = List(8, 17, 12, 3)

scala>   val minAgeAnimal = animals.animals.minBy(_.months)
minAgeAnimal: Animal = Animal(Snoop,Lion,3)

scala>   println(minAgeAnimal)
Animal(Snoop,Lion,3)

我觉得你的列表[Animal]的动物包装器有点不必要,因为你必须调用.Animals来获取基础集合,但这应该可以实现你想要的。您可以利用该函数将元组映射到
Animal
并使用Collections函数按年龄查找最小的元组:

scala>   val raw_Animals = List(("Hero", "Dog", 8), ("Ninja", "Cat", 17), ("Kitty", "Cat", 12), ("Snoop", "Lion", 3))
raw_Animals: List[(String, String, Int)] = List((Hero,Dog,8), (Ninja,Cat,17), (Kitty,Cat,12), (Snoop,Lion,3))

scala>   val animals = Animals(raw_Animals.map(Animal.tupled))
animals: Animals = Animals(List(Animal(Hero,Dog,8), Animal(Ninja,Cat,17), Animal(Kitty,Cat,12), Animal(Snoop,Lion,3)))

scala>   val ages = animals.animals.map(_.months)
ages: List[Int] = List(8, 17, 12, 3)

scala>   val minAgeAnimal = animals.animals.minBy(_.months)
minAgeAnimal: Animal = Animal(Snoop,Lion,3)

scala>   println(minAgeAnimal)
Animal(Snoop,Lion,3)

这是结果错误:value tuple不是object的成员,这可能是因为您有同名的伴生对象,在这种情况下,您可以使用:(Animal.apply u)。tupledYes,works Karl给我一个很好的答案,这个sems也可以工作,但第一个tuple说我未定义。啊,因为动物只有一个参数,所以Animals.tuple不起作用,在这种情况下,动物本身就足够了。:)这是结果错误:value tuple不是object的成员,这可能是因为您有同名的伴生对象,在这种情况下,您可以使用:(Animal.apply u)。tupledYes,works Karl给我一个很好的答案,这个sems也可以工作,但第一个tuple说我未定义。啊,因为动物只有一个参数,所以Animals.tuple不起作用,在这种情况下,动物本身就足够了。:)谢谢,结果如我所料,我能用上述方法来调节吗?我想从对象列表中检索最小值,但最小值不包括对象列表的第一个和最后一个元素。问题来了,当我尝试获取所选对象的邻域时,如果最小值在开始或结束处,将返回OutOfBounds。是否希望相对元素位于最小值旁边?有很多方法可以做到这一点,这取决于您是否想要一个长度可变的列表[Animal](先获取minAgeAnimal的索引,然后获取animals.animals.slice(minIdx-1,minIdx+1)),或者您是否想要一个长度为3的列表[Option[Animal](您需要添加更多的逻辑)。如果不太有帮助的话,你最好输入另一个问题。你上面写的方法效果很好,我的列表[]是静态大小,有35个元素,如果我的索引使用min为0,那么我就没有左邻域,如果最后一个和右邻域相同。我需要以某种方式删除第一个和最后一个元素,在缩减列表中选择最小值,然后追加第一个和最后一个。但缩小后的地图索引将在1处再次变为0。谢谢,结果如我所期望的那样。我可以使用上面的最小值方法进行条件化吗?我想从对象列表中检索最小值,但最小值不包括对象列表的第一个和最后一个元素。问题来了,当我尝试获取所选对象的邻域时,如果最小值在开始或结束处,将返回OutOfBounds。是否希望相对元素位于最小值旁边?有很多方法可以做到这一点,这取决于您是否想要一个长度可变的列表[Animal](先获取minAgeAnimal的索引,然后获取animals.animals.slice(minIdx-1,minIdx+1)),或者您是否想要一个长度为3的列表[Option[Animal](您需要添加更多的逻辑)。如果不太有帮助的话,你最好输入另一个问题。你上面写的方法效果很好,我的列表[]是静态大小,有35个元素,如果我的索引使用min为0,那么我就没有左邻域,如果最后一个和右邻域相同。我需要以某种方式删除第一个和最后一个元素,在缩减列表中选择最小值,然后追加第一个和最后一个。但缩小后的地图索引将在原来的1处再次变为0。