Scala Collections使用包含贴图的对象对序列进行过滤和排序,然后对其进行迭代

Scala Collections使用包含贴图的对象对序列进行过滤和排序,然后对其进行迭代,scala,sorting,collections,filter,collect,Scala,Sorting,Collections,Filter,Collect,给定一个对象: case class GT(code: String,names: Map[String, Option[String]]) {} 及 清单: val gText = List(new GT("USB", Map("de" -> Some("a"), "en" -> Some("abc"), "fr" -> Some("ab"))), new GT("Switch", Map("de" -> Some("abcdef

给定一个对象:

 case class GT(code: String,names: Map[String, Option[String]]) {}

清单:

val gText = List(new GT("USB", Map("de" -> Some("a"), "en" -> Some("abc"), "fr" -> Some("ab"))),
                  new GT("Switch", Map("de" -> Some("abcdef"), "en" -> Some("b"), "fr" ->  
                          Some("abc"), "es" -> Some("abc"))),
                  new GT("PVC", Map("de" -> Some("abc"), "en" -> Some("bc"), "fr" -> Some("abcd"))))
我想迭代gText列表,但依赖于映射名称的键,并按照每个名称映射值的长度降序

第一次迭代应按以下顺序进行,并带有de值:

1. code: "Switch" & names.key="de" & names.value = Some("abcdef")
2. code: "PVC" & names.key="de" & names.value = Some("abc")
3. code: "USB" & names.key="de" & names.value = Some("a")
第二次迭代应按以下顺序进行,数值为en:

1. code: "USB" & names.key="en" & names.value = Some("abc")
2. code: "PVC" & names.key="en" & names.value = Some("bc")
3. code: "Switch" & names.key="en" & names.value = Some("b")
第三次迭代应按以下顺序进行,并带有fr值:

1. code: "PCV" & names.key="fr" & names.value = Some("abcd")
2. code: "Switch" & names.key="fr" & names.value = Some("abc")
3. code: "Switch" & names.key="fr" & names.value = Some("ab")
最后一次迭代是针对names.key=es的 代码=开关和名称。键=es和名称。值=Someabc

如上所述,主要目标是根据每个值的长度迭代不同GT依赖项的相同键的值

我该怎么做呢。也许首先我必须收集一组额外的密钥,然后过滤和排序。欢迎提出任何建议

提前谢谢。 乌戈尔

第一行将GT列表“展平”为USB、en、Someabc形式的元组

第二行按语言i对其进行分组。Een=>列出USB,en,Someabc


如果选项未定义,则for construction将按降序遍历所有语言,然后根据原始名称映射0的值的长度对条目进行排序;如果你不想与众不同,就把它设为1。

我不太清楚你想要的迭代顺序,但这里有另一种剥猫皮的方法

  val countrySet = gText.flatMap { _.names.keys }.toSet 
  for {
    c <- countrySet
    gc = gText.filter(_.names.contains(c))
    g <- gc.sortBy(_.names(c).get.length).reverse
  } println("country " + c + " " + g)

获取一组国家/地区。然后,迭代这些,将列表筛选为仅包含当前国家/地区条目的列表,根据相应值的长度对列表进行排序,以获得递减长度

如何在一次迭代中做到这一点。-但您的示例给出了四次迭代。所以我不知道你在问什么。国家/地区代码的编号和值是否事先已知?您不需要将new与case classesthx一起使用。一次迭代是不可能的。我想知道如何只迭代一个按长度排序的键的值。Thx,这是一个完美的解决方案。我已经测试过了。非常感谢你,保罗!
  val countrySet = gText.flatMap { _.names.keys }.toSet 
  for {
    c <- countrySet
    gc = gText.filter(_.names.contains(c))
    g <- gc.sortBy(_.names(c).get.length).reverse
  } println("country " + c + " " + g)