-1

given an object:

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

and

a list :

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"))))

I want to iterate over the gText List but dependent from the key of map "names" and in descending order of the length of each "names" map value.

First iteration should be in the following oder with the values for "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")

Second iteration should be in the following oder with the values for "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")

Third iteration should be in the following oder with the values for "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")

Last iteration is for names.key="es" code="Switch" & names.key="es" and names.value = Some("abc")

As mentioned above the main goal is to iterate the values for the same key of the different GT's dependent from the length of each value.

How can I do that. Maybe first of all I have to collect the key in an additional set and then filter and sortyBy. Please any suggestions are welcome.

Thanks in advance. Ugur

4

2 回答 2

1
val gtEntries = gText.flatMap( gt => gt.names.toList.map(entry => (gt.code, entry._1, entry._2)))
val gtEntriesByLang = gtEntries.groupBy(_._2)

for (lang <- gtEntriesByLang.keys.toList.sorted;
 gtEntry <- gtEntriesByLang(lang).sortBy(entry => -entry._3.map(_.length).getOrElse(0) ))
 {
    println(gtEntry)
 }

第一行将 GT 列表“扁平化”为 ("USB","en",Some("abc")) 形式的元组。

第二行按语言分组,即 "en" => List(("USB","en",Some("abc"), ...)

for 理解按降序遍历所有语言,然后按原始名称映射的值的长度对条目进行排序(如果选项未定义,则为 0;如果您想与“”没有区别,则将其设为 1)。

于 2014-09-22T09:42:37.270 回答
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)

获取一组国家。然后,遍历这些,将列表过滤为仅具有当前国家/地区条目的列表,按相应值的长度对该列表进行排序(反转,以获得降序长度)

于 2014-09-22T09:56:59.513 回答