Ocaml:打印出int列表数组中的元素

时间:2011-04-22 23:52:47

标签: printing arraylist ocaml element state

我有一个创建状态的函数。状态定义为:

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

状态本身既是图形又是布尔数组。我很困惑从这里做什么(实现)。我知道我必须做什么,这是通过我的图表迭代,并打印索引后跟一个箭头,然后是单独的整数。

但我究竟该怎么做?

2 个答案:

答案 0 :(得分: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。您仍然需要在每行的开头打印索引和箭头,并且只有在有索引时才打印一行。

答案 1 :(得分:0)

我忘记了大部分的ocaml,很抱歉我不写代码: - )

数组和列表都有map吗?如果是这样,映射数组并返回索引+“ - >”,并在该映射中还附加在映射列表时获得的内容,将整数转换为字符串并连接它们。

这有用吗?