【问题标题】:Multidimensional-array in CeylonCeylon 中的多维数组
【发布时间】:2018-03-24 17:03:02
【问题描述】:
我想在 Ceylon 使用多维数组工作。这是在锡兰计划的吗?如果是,我该如何申报?
我想在 Ceylon 中使用这个结构,如下面的 Java 所示:
int x = 5;
int y = 5;
String[][] myStringArray = new String [x][y];
myStringArray[2][2] = "a string";
【问题讨论】:
标签:
arrays
multidimensional-array
ceylon
【解决方案1】:
首先,考虑您是否真的需要数组(即具有固定长度和可修改元素的东西),或者列表(或列表的列表)或映射是否更好。虽然从你的例子来看,你似乎需要修改。
在 JVM 中,“多维”数组只是数组的数组。
在 Java 中,new String[y] 创建一个填充有 null 条目的数组,这在 Ceylon 中是 String 类型的不允许值。因此,您可以拥有一个String? 数组(允许null),或者使用其他值预先填充数组,例如使用Array.ofSize(...):
Array.ofSize(y, "hello")
同样适用于数组数组。我们可以这样做:
value myStringArray = Array.ofSize(x, Array.ofSize(y, "hello"));
虽然这将在二维数组的每个“行”中具有相同的数组,但这不是我们想要的(因为替换 myStringArray[2][2] 会将所有条目替换为 2 作为第二个坐标)。这里的另一个 Array 构造函数很有用,它需要一个可迭代对象:
value myStringArray = Array({ Array.ofSize(y, "hello") }.repeat(x));
这利用了可迭代枚举懒惰地评估其参数这一事实,因此数组构造函数将获得 x 个不同的元素。
【解决方案2】:
我喜欢 Paulo 的回答,但这是另一种方法,它允许我们使用推导来填充 2D 数组:
//the size of the square 2D array
value n = 5;
//create it using a nested comprehension
value arr = Array {
for (i in 1..n-1) Array {
for (j in 0..n-1)
i==j then 1 else 0
}
};
//display it
for (row in arr) {
printAll(row);
}