【问题标题】:Is there a simple way to print each element of an array?有没有一种简单的方法来打印数组的每个元素?
【发布时间】:2015-08-04 07:48:47
【问题描述】:
let x=[|15..20|]
let y=Array.map f x
printf "%O" y

嗯,我得到了类型信息。

有什么方法可以打印“y”的每个元素,用“,”作为分隔符,而不必使用 for 循环?

【问题讨论】:

  • homework@stackexchange?

标签: arrays printing f#


【解决方案1】:

System 命名空间中使用 String.Join 或 F# 'native':

let x = [| 15 .. 20 |]

printfn "%s" (System.String.Join(",", x))

x |> Seq.map string |> String.concat "," |> printfn "%s"

【讨论】:

  • 嗯,我很喜欢这种流水线式的编程方式,步骤很清晰。就像 powershell 一样!
【解决方案2】:

在这种情况下,使用String.concat 将字符串与分隔符连接起来可能是最好的选择(因为您不想将分隔符放在末尾)。

不过,如果你只想打印所有元素,你也可以使用Array.iter

let nums= [|15..20|]
Array.iter (fun x -> printfn "%O" x) nums    // Using function call
nums |> Array.iter (fun x -> printfn "%O" x) // Using the pipe 

在这种情况下添加分隔符比较困难,但可以使用iteri

nums |> Array.iteri (fun i x ->
  if i <> 0 then printf ", "
  printf "%O" x) 

【讨论】:

  • 请注意,在第一种情况下,不需要冗长的fun x -&gt;Array.iter (printfn "%O") numsnums |&gt; Array.iter (printfn "%O")
【解决方案3】:

如果数组很大,它不会打印整个数组;我认为它只打印前 100 个元素。不过,我怀疑这就是你所追求的:

printfn "%A" y

【讨论】:

    【解决方案4】:

    如果项目数组很大并且您不想生成大字符串,另一种选择是生成交错序列并跳过第一项。下面的代码假设数组至少有一个元素。

    这种方法的一个优点是它可以清晰地将交错项目的行为和打印的行为分开。它还无需在每次迭代时检查第一项。

    let items = [| 15 .. 20|]
    
    let strInterleaved delimiter items = 
        items 
        |> Seq.collect (fun item -> seq { yield delimiter; yield item}) 
        |> Seq.skip(1)
    
    items
    |>  Seq.map string
    |>  strInterleaved "," 
    |>  Seq.iter (printf "%s")
    

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2011-04-10
      • 2015-06-28
      • 2021-02-25
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多