2011-04-22 102 views
3

我有一個創建狀態的函數。的狀態被定義爲:Ocaml:打印出int列表數組中的元素

type state = graph * bool array;; 

的曲線圖是:

type graph = int list array;; 

的曲線圖是一個陣列,並且每個索引處可能存在存儲在該索引位置的int列表。

我有一個功能,使一個國家,我試圖打印出輸出文件的狀態的元素。

我所定義的函數,如下所示:

let state_of_graph (s:state) (out:out_channel) : unit = 
    match s with 
    (g, b) 

我基本上要通過我的曲線圖(g)至迭代並打印出索引以及在INT列表中的每個元素(如果元素存在,否則不要打印出空的元素)。

欲打印出來的方式: (考慮索引0中有2個元件)

index0 -> element1 
index 0-> element2 

1 -> 2 3 

狀態本身既是的曲線圖和布爾矩陣。我很困惑從這裏(實施)到底要做什麼。我知道我必須做什麼,這是遍歷我的圖形,並打印索引後面跟着一個箭頭,然後單獨的整數。

但我該如何做到這一點?

+0

不要這樣做!讓你的問題保持完好,以便人們仍然可以閱讀它。爲了表明一個問題已經得到解決,只需將其中一個答案(最有用的答案)標記爲已接受即可。 (如果您發現它們至少部分有用,您也可以通過單擊左側數字上方的向上三角形來獲得任意數量的答案。) – Gilles 2011-04-26 00:03:19

回答

1

您對數據結構的描述相當差。例如,你寫了「一個圖是一個數組,並且在每個索引處可能存在一個存儲在該索引處的int列表。」那麼,這幾乎就是type graph = int list array的意思(事實上,每個索引總是存在一個int列表),所以你的英文句子不會傳達任何額外的信息。解釋每個數組元素代表什麼會更有用。既然你在談論圖表,我想這是類似於a.(i)包含j意味着從ij有一個優勢?

但是,由於您要執行的任務是根據數據結構來描述的,因此我想我明白您想要執行的操作。

要遍歷數組,您有兩個主要可能性:編寫for循環,或使用函數Array.iterArray.iteri之一。這個任務似乎很適合Array.iteri,因爲你只是走過數組,你需要知道索引。

let print_graph (g, a : state) (out : out_channel) : unit = 
    Array.iteri (fun i l -> …) g;; 

好吧,現在我們需要知道如何處理每個數組元素。每個元素是一個整數列表:l的類型爲int list。從您的示例輸出中,您只需按順序輸出列表元素,並在兩者之間留出空間。要按順序遍歷列表中的元素,標準庫函數List.iter就恰到好處。

let print_node (l : int list) (out : out_channel) : unit = 
    List.iter (fun j -> print_char ' '; print_int j) l;; 

您現在應該能夠使用print_node完成print_graph。您仍然必須在每行的開始處打印索引和箭頭,並且僅在存在索引時纔打印行。

0

我忘了我的大多數ocaml的,所以對不起,我不寫代碼:-)

是否都陣列和列表有map?如果是這樣,則映射數組並返回索引+「 - >」,並在該映射中追加當您映射到列表上時獲得的內容,將ints轉換爲字符串並將它們連接起來。

這有幫助嗎?