【问题标题】:Ocaml: printing out elements in an array of int listsOcaml:打印出 int 列表数组中的元素
【发布时间】:2011-04-22 23:52:47
【问题描述】:

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

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

状态本身既是图形又是布尔数组。我对从这里(实现)到底要做什么感到困惑。我知道我必须做什么,即遍历我的图表,并打印出索引,然后是箭头,然后是单独的整数。

但是我到底该怎么做呢?

【问题讨论】:

  • 不要那样做!保持您的问题完整,以便人们仍然可以阅读它。要表明问题已解决,只需将其答案之一(最有帮助的答案)标记为已接受,就像您所做的那样。 (如果您发现它们至少部分有帮助,您也可以通过单击左侧数字上方的向上三角形来为任意数量的答案投票。)

标签: printing arraylist ocaml element state


【解决方案1】:

您对数据结构的描述相当糟糕。例如,你写“一个图是一个数组,在每个索引处可能有一个 int 列表存储在该索引处。”嗯,这几乎就是type graph = int list array 的意思(事实上,每个索引处总是存储一个int 列表),所以你的英文句子没有传达任何额外的信息。解释每个数组元素代表什么会更有用。既然你在谈论图形,我猜它就像a.(i) contains 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。您仍然需要在每行的开头打印索引和箭头,并且只有在有索引时才打印一行。

【讨论】:

    【解决方案2】:

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

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

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多