按照先前的顺序排序列表

时间:2016-11-09 21:51:06

标签: scala

在下面的代码中,从List删除元素后,应重新创建val originalOrdering List的排序。

如果val random3ElementStringList取值List(3, 4, 1),则应将列表重新排序为List(1 , 3 , 4) 原始列表val originalOrdering的值为1,2,3,4,但不会显示List中可包含的值。该列表可以包含除数字以外的字符。

import scala.collection.immutable._

object sort extends App {

    val originalOrdering : List[String] = List("1" , "2" , "3" , "4");

    var random3ElementStringList : List[String] = util.Random.shuffle(originalOrdering).take(3)

    val stringPositions : Map[String , Int] = originalOrdering.zipWithIndex.toMap

    println(random3ElementStringList)

    println(stringPositions);

    val fl = random3ElementStringList.foldLeft("")((a , b) => (stringPositions.get(b)+","))

    println(fl)

}

此代码的输出为:

List(2, 3, 4)
Map(1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3)
Some(3),

但是fl应该按照排序顺序包含句子,其中排序由stringPositions

中的原始顺序决定

更新:

import scala.collection.immutable._

object sort extends App {

    def reOrder(originalList : List[String] , originalListSubset : List[String]) = {

        val stringPositions : Map[String , Int] = originalList.zipWithIndex.toMap
        val fl : List[(String , Int)] = originalListSubset.map(m => (m , stringPositions.get(m).get))

        fl.sortBy(s => s._2).map(m => m._1)
    }

    val originalList : List[String] = List("a" , "b" , "c" , "f");
    var random3ElementStringList : List[String] = util.Random.shuffle(originalList).take(3)

    println(random3ElementStringList)
    println(reOrder(originalList , random3ElementStringList))

    random3ElementStringList = util.Random.shuffle(originalList).take(2)

    println(random3ElementStringList)
    println(reOrder(originalList , random3ElementStringList))
}

1 个答案:

答案 0 :(得分:1)

您忘了在折叠功能中使用a。它是折叠的“累加器”。你可以像这样解决它:

val fl = random3ElementStringList.foldLeft("") { (acc, index) =>
  acc +","+ stringPositions.get(index)
}

我更改了参数名称以使其更清晰。这是输出:

List(3, 4, 2)
Map(1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3)
,Some(2),Some(3),Some(1)

你可以在开头摆脱那个逗号,但我会建议你一个没有foldLeft的更简单的解决方案:

val fl = random3ElementStringList.map(stringPositions.get).mkString(",")

您可以映射这些随机索引并获取元素,然后使用给定的分隔符创建一个字符串。输出为Some(2),Some(3),Some(1)