我写了这个f#代码来创建一个锯齿状(非矩形)数组。
open System
type MatrizIrregular() =
let irregular = Array2D.zeroCreate 5
member This.Inicializar() =
for f in 0 .. 4 do
printf "Introduzcal el número de columnas de la matriz de la fila %d: " f
let res = Console.ReadLine()
let col = Int32.Parse(res)
Array2D.set irregular f (col)
for c in 0 .. col - 1 do
printf "Introduzca el valor de la columna %d: " c
let res2 = Console.ReadLine()
Array2D.set irregular f c (Int32.Parse(res2))
member This.Mostrar() =
for f in 0 .. 4 do
for f in 0 .. irregular.[f,c].Lenght - 1 do
printf "%d " irregular.[f,c]
printf "\n"
let matriz = MatrizIrregular()
matriz.Inicializar()
matriz.Mostrar()
我在第11,15行
上遇到错误此表达式应该具有类型' a [,]但这里的类型为int - > ' B [,]
和第19,20行
运营商' expr。[idx]'已基于此程序点之前的信息用于不确定类型的对象。考虑添加更多类型约束。
我想在f#
中做这样的java代码import java.util.Scanner;
public class MatrizIrregular {
public Scanner teclado = new Scanner(System.in);
public int[][] irregular;
public void inicializar(){
irregular = new int[5][];
for(int f=0;f<irregular.length;f++){
System.out.print("Introduzca el numero de columnas del la fila de la matriz "+f+": ");
int col = teclado.nextInt();
irregular[f] = new int[col];
for(int c =0; c<irregular[f].length;c++){
System.out.print("Introduzca el elemento de la columna "+c+": ");
irregular[f][c] = teclado.nextInt();
}
}
}
public void mostrar(){
for(int f=0;f<irregular.length;f++){
for(int c=0;c<irregular[f].length;c++){
System.out.print(irregular[f][c]+" ");
}
System.out.print("\n");
}
}
public static void main(String[] ar){
MatrizIrregular matriz = new MatrizIrregular();
matriz.inicializar();
matriz.mostrar();
}
}
答案 0 :(得分:2)
你不能像这样做出锯齿状的2D数组。 Array2D
和类型[,]
,只能用于矩形2D数组。
要了解如何使用锯齿状数组,请查看this link。
我想对您对Array2D.zeroCreate
的使用发表评论。它有这种类型:
val it : (int -> int -> 'a [,])
当你给它两个整数时,它会给你一个数组。如果只给它一个整数:
let irregular = Array2D.zeroCreate 5
val irregular : (int -> '_a [,]) (* Also complains about generic types. *)
你得到一个函数,当给定缺少的第二个维度时,它会给你一个数组。您没有获得具有未指定的第二维的数组。
(也许可以尝试在解释器中使用let f x y = x + y
和f 1
;请查看类型是什么,并尝试将f
应用于一两件事。)
答案 1 :(得分:2)
2D数组不是不规则的,因此与java类似,您需要声明array
array
个int
的{{1}}。在F#中,int array array
和zeroCreate需要知道它要为什么类型初始化数组。还要注意缩进,你的嵌套for循环没有正确缩进。
open System
type MatrizIrregular() =
let irregular : int array array = Array.zeroCreate 5
member This.Inicializar() =
for f in 0 .. 4 do
printf "Introduzcal el número de columnas de la matriz de la fila %d: " f
let res = Console.ReadLine()
let col = Int32.Parse(res)
let cols : int array = Array.zeroCreate col
for c in 0 .. col - 1 do
printf "Introduzca el valor de la columna %d: " c
let res2 = Console.ReadLine()
Array.set cols c (Int32.Parse(res2))
Array.set irregular f cols
member This.Mostrar() =
for f in 0 .. 4 do
for c in 0 .. (Array.length irregular.[f]) - 1 do
printf "%d " irregular.[f].[c]
printf "\n"
let matriz = MatrizIrregular()
matriz.Inicializar()
matriz.Mostrar()
不是最有效的答案,但它是被要求的。