2017-10-09 4 views
0

スードクジェネレータの一部として、特定のインデックスの内部リストとそれらのリスト内の特定のインデックスの内部リスト要素のみを返す機能があります。アイデアは、リスト[Int]を返すことです。リスト[Int]は、関数への引数として提供されるリスト[List] [Int]で表される9x9スドックパズルから取得した3x3四角の値を含みます。Scalaのスクロールジェネレータでネストされたリストとリストアイテムをフィルタリングする

私は2つのアプローチを試みましたが、一貫して動作することができませんでした。 1つのアプローチでは、リストから特定のサブリストを除外し、残りのリストから項目を除外します。この機能は、いくつかの指標で完全に動作しますが、他のユーザーとは、すべてのいくつかのサブリストからあまりにも多くのか、少なすぎるインデックス値をフィルタ処理ではなくなります。ここでは

def getGroup(indexX: Int, indexY: Int, puzzle: List[List[Int]]): List[Int] = { 
    val groupX = { //determining row coordinate 
    if(indexX <= 2) 2 
    else if(indexX <= 5) 5 
    else 8 
    } 
    val groupY = { //determining column coordinate 
    if(indexY <= 2) 2 
    else if(indexY <= 5) 5 
    else 8 
    } 
    // Using filter 
    val subsection: List[List[Int]] = puzzle.filter(x => puzzle.indexOf(x) <= groupX && puzzle.indexOf(x) >= groupX - 2) 
    // This sometimes filters out too many or too few items 
    val group: List[List[Int]] = subsection.map(x => x.filter(y => x.indexOf(y) <= groupY && x.indexOf(y) >= groupY - 2)) 

    val result = group.flatten 
    println("subsection " + subsection) 
    println("group " + group) 
    result 
} 

は、テスト一覧[一覧[INT]]からいくつかの出力であります途中で結果を表示するために印刷します。なぜなら、間違ったインデックスがいくつかのサブリストから除外されているが、同じ関数呼び出しのすべてではないという理由は明らかではない。私は単に間違ったインデックスを選択したとは思わないか、同じ関数呼び出しのすべてのサブリストに対して同じ方法で間違っているはずです。ここで、

def getGroup(indexX: Int, indexY: Int, puzzle: List[List[Int]]): List[Int] = { 
     //this portion is the same as above until the for expression: 
    val groupX = { //determining row coordinate 
    if(indexX <= 2) 2 
    else if(indexX <= 5) 5 
    else 8 
    } 
    val groupY = { //determining column coordinate 
    if(indexY <= 2) 2 
    else if(indexY <= 5) 5 
    else 8 
} 
    // using for expression 
    val group = for(
     outer <- puzzle if puzzle.indexOf(outer) <= groupX && puzzle.indexOf(outer) >= groupX - 2; 
     inner <- outer if outer.indexOf(inner) <= groupY && outer.indexOf(inner) >= groupY - 2) 
     yield inner 
    group 
} 

は私がこの一覧[一覧[INT]]でこの機能をテストしている:

test: List[List[Int]] = List(List(0, 2, 3, 4, 5, 6, 7, 8, 9), List(1, 2, 3, 4, 5, 6, 7, 8, 9), List(2, 2, 3, 4, 5, 6, 7, 8, 9), List(3, 2, 3, 4, 5, 6, 7, 8, 9), List(4, 2, 3, 4, 5, 6, 7, 8, 9), List(5, 2, 3, 4, 5, 6, 7, 8, 9), List(6, 2, 3, 4, 5, 6, 7, 8, 9), List(7, 2, 3, 4, 5, 6, 7, 8, 9), List(8, 2, 3, 4, 5, 6, 7, 8, 9)) 

scala> getGroup(2,2,test) 
subsection: List(List(0, 2, 3, 4, 5, 6, 7, 8, 9), List(1, 2, 3, 4, 5, 6, 7, 8, 9), List(2, 2, 3, 4, 5, 6, 7, 8, 9)) 
group: List(List(0, 2, 3), List(1, 2, 3), List(2, 2, 3)) 
res12: List[Int] = List(0, 2, 3, 1, 2, 3, 2, 2, 3) //Correct 

scala> getGroup(2,7,test) 
subsection: List(List(0, 2, 3, 4, 5, 6, 7, 8, 9), List(1, 2, 3, 4, 5, 6, 7, 8, 9), List(2, 2, 3, 4, 5, 6, 7, 8, 9)) 
group: List(List(7, 8, 9), List(7, 8, 9), List(7, 8, 9)) 
res13: List[Int] = List(7, 8, 9, 7, 8, 9, 7, 8, 9) //Correct 

scala> getGroup(7,7,test) 
subsection: List(List(6, 2, 3, 4, 5, 6, 7, 8, 9), List(7, 2, 3, 4, 5, 6, 7, 8, 9), List(8, 2, 3, 4, 5, 6, 7, 8, 9)) 
group: List(List(7, 8, 9), List(8, 9), List(7, 9)) //Missing a 7 and an 8 
res14: List[Int] = List(7, 8, 9, 8, 9, 7, 9) 

scala> getGroup(4,0,test) 
subsection: List(List(3, 2, 3, 4, 5, 6, 7, 8, 9), List(4, 2, 3, 4, 5, 6, 7, 8, 9), List(5, 2, 3, 4, 5, 6, 7, 8, 9)) 
group: List(List(3, 2, 3), List(4, 2, 3, 4), List(5, 2, 3, 5)) //Not enough values filtered out--unwanted 4 and 5 
res32: List[Int] = List(3, 2, 3, 4, 2, 3, 4, 5, 2, 3, 5) 

この他のアプローチは、場合にのみ、条件に合うような値が得られますforループを使用しています各リストは、そのインデックス番号で始まり、ちょうどその後、カウントアップ:

val testGrid = List(List(0,2,3,4,5,6,7,8,9),List(1,2,3,4,5,6,7,8,9),List(2,2,3,4,5,6,7,8,9), 
List(3,2,3,4,5,6,7,8,9),List(4,2,3,4,5,6,7,8,9),List(5,2,3,4,5,6,7,8,9), 
List(6,2,3,4,5,6,7,8,9),List(7,2,3,4,5,6,7,8,9),List(8,2,3,4,5,6,7,8,9)) 

ただし、出力は常に正しいではありません。

scala> getGroup(0, 0, testGrid) 
res0: List[Int] = List(0, 2, 3, 1, 2, 3, 2, 2, 3) (correct) 
scala> getGroup(3,3,testGrid) 
res1: List[Int] = List(4, 5, 6, 5, 6, 4, 6) (too few) 
scala> getGroup(3,7,testGrid) 
res2: List[Int] = List(7, 8, 9, 7, 8, 9, 7, 8, 9) (correct) 
scala> getGroup(7,7,testGrid) 
res3: List[Int] = List(7, 8, 9, 8, 9, 7, 9) (too few) 
scala> getGroup(7,0,testGrid) 
res5: List[Int] = List(6, 2, 3, 6, 7, 2, 3, 7, 8, 2, 3, 8) (too many) 

なぜ私はこの出力を得ているのか明らかな答えがあるかもしれませんが、それは私を逃れました。 indexXの値にかかわらず、indexYが3より小さいすべてのテストが正しいため、内部ループと関係していると思われます。

これらのいずれかの試みについてフィードバックをいただければ幸いです。私はこの機能をより直観的にまたは簡潔にする代替アプローチについての考えを感謝するだろう。

答えて

1

.sliceを使用すると、リストのセクションをインデックスでフィルタリングできます。次に.map(x => x.slice(...))は内部リストと同じことを行い、最後に.flattenList[List[A]]List[A]に変換します。一緒に:

def getGroup(indexX: Int, indexY: Int, puzzle: List[List[Int]]): List[Int] = { 
    val xStart = indexX/3 * 3 
    val yStart = indexY/3 * 3 
    puzzle.slice(xStart, xStart + 3).map(row => row.slice(yStart, yStart + 3)).flatten 
} 
関連する問題