2016-11-09 7 views
1

Listのコードでは、val originalOrderingの順序は、Listから要素を削除した後に再作成する必要があります。前の順序によるリストの並べ替え

val random3ElementStringListは、リストがListに含まれることができる値を示唆していない1,2,3,4値でList(1 , 3 , 4) 元のリストval originalOrderingに再注文しなければならない値List(3, 4, 1)を取る場合。リストには数値以外の文字を含めることができます。

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

を使用しています折り畳み機能ではです。折りたたみの「アキュムレータ」です。

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)です。

+0

ありがとうございます、私はあなたのコードを拡張し、質問の更新を掲載しました。新しいバージョンでは、ソートの位置が注文によって決定され、更新を実装した後にこれが認識される、変更されたマップキーがソートされます。ありがとう! –

+0

私はそれを得ていませんでした。この更新されたコードで新しい質問がありますか? – laughedelic

+0

いいえ、ちょうど私の最終的なソリューションがあなたの上に構築されていることを指摘しています。 –

関連する問題