我想摆脱我方法中的零点。有谁知道如何做到这一点?我是否必须将矩阵转换为字符串,或者我可以在整数矩阵中以某种方式删除元素?
来自:
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
对此:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
public static void writeElement(int[][] m){
int[][] b = new int[m.length][m.length];
for(int row=0; row<m.length; row++){
b[row][0] = 1;
}
for(int col=1; col<m.length; col++){
b[0][col]=0;
}
for(int row=1; row<m.length; row++){
for(int col=1; col<m[row].length; col++){
b[row][col] = (b[row-1][col-1] + b[row-1][col]);
}
}
for(int i=0; i<b.length; i++){
for(int j=0; j<b[i].length; j++){
System.out.print(b[i][j] + " ");
}
System.out.println();
}
}//writeElement
答案 0 :(得分:1)
我是否必须将矩阵转换为字符串
当您使用System.out.println()时,您已经这样做了。你只需要改变你给出的方法。
从你拥有的东西开始:
for(int i=0; i<b.length; i++){
for(int j=0; j<b[i].length; j++){
System.out.print(b[i][j] + " ");//where you print results out
}
System.out.println();
}
你需要比b [i] [j] +&#34;更复杂的东西。 &#34;得到你想要的结果,因为整数&#39; 0&#39;的默认字符串解释。好吧,&#39; 0&#39;。你想要&#39; 0&#39; 0映射到空间&#39; &#39;
对我来说最简单的方法是创建一个处理这个逻辑的方法,因为如果有零,你实际上根本不需要输出。如果我误解了你的问题,使用一种方法可以让你以后很容易地改变它。 (您必须将此方法与writeElement类放在同一个类中。)
private static String getPrintValueForMatrix(int value)
{
if(value == 0)
return " ";//two spaces
else
return value+" ";
}
修改原始代码以调用方法
for(int i=0; i<b.length; i++){
for(int j=0; j<b[i].length; j++){
System.out.print(getPrintValueForMatrix(b[i][j]));//only this line changed
}
System.out.println();
}
这应该给你这样的结果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
答案 1 :(得分:0)
java中的数组具有固定的结构。创建后,您无法动态删除/添加插槽。如果你想这样做,你必须使用像java.util.arrayList。
这样的集合元素或者,您必须创建一个新数组;并以不同方式填充行。所以不要总是有相同的宽度;你只会为非零值分配空间。然后你会迭代你的整个矩阵;并仅复制非零值。
但当然:处理这样的矩阵需要非常精确;因为每个行数组可能有不同的长度!
选项1(使用列表)具有很大的优势,您可以在创建时进入并删除/添加元素。缺点是:集合仅适用于参考类型;在这种情况下:整数。这意味着一点内存开销。
选项2需要显式创建新数组;并且如上所述:精确处理长度。
答案 2 :(得分:0)
您可以设置数组String
类型,允许您在希望“删除”时将元素设置为空字符串(""
)。然后,当您要求元素时,您可以使用逻辑来忽略任何""
并仅使用数字。当然,这意味着只要您想要检索它们,就需要调用Integer.valueOf(b[/*indexOne*/][/*indexTwo*/])
将条目转换为int
类型。
此外,如果您想要使用String.valueOf(/*anInt*/)
而不是int
设置元素,则需要以类似的方式使用String
。