2016-03-29 6 views
1

81 karakter uzunluğunda bir dizeyi ayrıştıracak bir işlev yapıyorum. Ayrıştırma sırasında, belirtilen satır ve sütuntan dikey, yatay ve çapraz tüm koordinatları döndüren neighbors(Int: row, Int: col) adlı bir işlev kullanmam gerekir. Bu koordinat listesiyle, her bir koordinatta listelenen olası değerlerin her birinden aldığım değeri kaldırmam gerekiyor. Pano bir harita olarak temsil edilir ve bunu işlevsel olarak, yani var kullanmadan yapmam gerekir.Scala, bir yönetim kurulu tarafından temsil edilen bir harita üzerinde yinelenir

İşte
str.zipWithIndex.map{ 
    case (digit, index) => ((index/9, index % 9), List(digit.asDigit)) 
    }.toMap 

Ben neighbors işlevi hakkında bildiklerim:

İşte benim ayrıştırma işlevi var ayrıştırıcı üzerinde olsaydı

def neighbors(row: Int, col: Int): List[(Int, Int)] 

Örneğin, (0,2) koordine ve sayı girmiş harita 410 idi, o noktadan dikey, yatay ve çapraz tüm koordinatlardan 4 kaldırmak zorunda kalacaktı. Her bir noktanın değeri, olası değerlerin bir listesi olarak temsil edilir.

Ayrıca neighbor işlevinin uygulanmasına da izin verilmiyor.

Yardımın için teşekkürler! Sorunuzu doğru anladıysam

+0

1 - Düşündüm [Karl'ın öneri] (http://stackoverflow.com/questions/36266982/scala-returning-coordinate-as-tuple) sizin ayrıştırıcı için çok daha iyi bir tasarım oldu. 2 - Bu onun tam imzayı görmeden 'komşu' işlevini nasıl kullanılacağını önermek zor, ya da en azından onun dönüş veri türü. 3 - Daha doldurulan edilmemiş koordinatlardan şey çıkarmak, nedenle komşu 'parse' bittikten' sonra her elemana çağrılacak olurdu 'O, sizin açıklamasından, görünüyor. – jwvh

+0

Katılıyorum, Karl'ın önerisi harikaydı. Boş hücrelerin nasıl bir liste ile doldurulacağını anladım. Bu soruyu yayınladığımda, henüz anlayamadım. Ben soruyu güncelleyeceğiz. Ayrıca, 'komşu' işlevinin imzasını ekleyeceğiz. Teşekkürler! – Colby

cevap

1

, fonksiyonel kalırken (bu durumda Map kaldırmak) şeyleri mutasyona nasıl oluyor?

  1. kuyruk özyinelemeli fonksiyon oluşturma "değişken" verileri işlemek için elemanlarını ve mevcut durumunu kalan listesiyle her yineleme için çağrılır:

    Evetse, iki yaklaşım vardır aynı, ama görünüyor

    @tailrec 
    def process(
        input: List[(Char, Int)], 
        board: Map[Any, Any], 
        resultAccum: List[Result]): List[Result] = input match { 
        case Nil => resultAccum.reverse 
        case (char, pos) :: tail => 
        // do the processing 
        val updatedBoard = board - ??? // create update version of the board 
        val updateResults = ??? :: resultAccum 
        process(tail, updatedBoard, updateResults) 
    } 
    
  2. Yoksa foldLeft kullanabilirsiniz, daha kısa:

    input.foldLeft((initialBoard, List[Result]())) { 
        case ((board, resultsAccum), (char, pos)) => 
        val updatedBoard = board - ??? // create update version of the board 
        val updateResults = ??? :: resultsAccum 
        (updatedBoard, updateResults) 
    }._2.reverse 
    

    foldLeft'un başlangıç ​​durumu, kartın başlangıç ​​durumunu ve sonuçların boş listesini içerir.