2017-03-10 12 views
-2

複数のcolmuns(10列以上)をスカラー言語でソートする方法。例えば :複数のcolmuns(10列以上)をスカラー言語でソートする方法は?

1 2 3 4 
4 5 6 3 
1 2 1 1 
‌2 3 5 10 

所望の出力

1 2 1 1 
1 2 3 3 
2 3 5 4 
4 5 6 10 
+4

質問は不明です。何を試しましたか?列をどのように読んでいますか(例:ファイルから)あなたのコードを投稿することを忘れないでください:) –

+0

はい。テキストファイルから区切り記号はスペースです – mop

+0

あなたが試したコードを投稿してください。あなたは最初に試して、あなたが遭遇した問題を教えてください。 – djsumdog

答えて

1

val input = io.Source.fromFile("junk.txt") // open file 
        .getLines    // load all contents 
        .map(_.split("\\W+")) // turn rows into Arrays 
        .map(_.map(_.toInt)) // Arrays of Ints 

val output = input.toList   // from Iterator to List 
        .transpose  // swap rows/columns 
        .map(_.sorted) // sort rows 
        .transpose  // swap back 

output.foreach(x => println(x.mkString(" "))) // report results 

注:これは、数字の間に空白を使用できますが、それは他のセパレータ(カンマなど)を検出した場合または行が空白で始まる場合に予想されるArray[Int]を作成するのに失敗します。

また、行がすべて同じサイズでない場合は、transposeがスローします。

0

Iは、以下のアルゴリズムに従いました。まず、行と列の次元を変更します。その後、行をソートし、元の行と列の構成を元に戻すために次元を再度変更します。ここに、概念実証のサンプルがあります。

object SO_42720909 extends App { 

    // generating dummy data 
    val unsortedData = getDummyData(2, 3) 
    prettyPrint(unsortedData) 
    println("----------------- ") 

    // altering the dimension 
    val unsortedAlteredData = alterDimension(unsortedData) 
    // prettyPrint(unsortedAlteredData) 

    // sorting the altered data 
    val sortedAlteredData = sort(unsortedAlteredData) 
    // prettyPrint(sortedAlteredData) 

    // bringing back original dimension 
    val sortedData = alterDimension(sortedAlteredData) 
    prettyPrint(sortedData) 

    def alterDimension(data: Seq[Seq[Int]]): Seq[Seq[Int]] = { 
    val col = data.size 
    val row = data.head.size // make it safe 
    for (i <- (0 until row)) 
     yield for (j <- (0 until col)) yield data(j)(i) 
    } 

    def sort(data: Seq[Seq[Int]]): Seq[Seq[Int]] = { 
    for (row <- data) yield row.sorted 
    } 

    def getDummyData(row: Int, col: Int): Seq[Seq[Int]] = { 
    val r = scala.util.Random 
    for (i <- (1 to row)) 
     yield for (j <- (1 to col)) yield r.nextInt(100) 
    } 

    def prettyPrint(data: Seq[Seq[Int]]): Unit = { 
    data.foreach(row => { 
     println(row.mkString(", ")) 
    }) 
    } 
} 
関連する問題