【问题标题】:Delete integers in a matrix删除矩阵中的整数
【发布时间】:2016-08-10 18:04:05
【问题描述】:

我想摆脱我方法中的零。有谁知道如何做到这一点?我是否必须将矩阵转换为字符串,或者我可以以某种方式删除整数矩阵中的元素?

来自:

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

【问题讨论】:

  • 您到底想完成什么?您是想简单地不打印0s,还是真的想修改m 以用较短的数组替换尾随零元素的数组?
  • @rabbitguy 这不是一个真正的二维数组,它只是一个 int 数组的数组。并非所有数组都必须具有相同的长度。拥有类似int[][] m = { { 1 }, { 1, 2 }, { 1, 2, 3 } }; 的东西是完全合法的
  • 我想创建一个 n*n 矩阵并在没有零的情况下打印它。是的,我只是不想打印它们。但是由于计算矩阵的其余部分需要第一行 0,我想我必须在创建具有 0 的矩阵之后摆脱它们。抱歉,我是 java 的大菜鸟!

标签: java matrix multidimensional-array


【解决方案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]+" " 稍微复杂一点的东西来得到你想要的结果,因为整数 '0' 的默认字符串解释是,嗯,'0'。您希望 '0' 映射到空间 ' '。

对我来说似乎最简单的方法是创建一个处理这个逻辑的方法,因为如果有一个零,你实际上可能根本不想要输出。如果我误解了您的问题,使用一种方法可以让您稍后非常轻松地更改它。 (您必须将此方法放在与您的 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 

【讨论】:

  • 非常感谢伙计!效果很好:)
【解决方案2】:

java 中的数组具有固定的结构。创建后,您无法动态删除/添加插槽。如果你想这样做,你将不得不使用像 java.util.arrayList 这样的集合元素。

或者,您必须创建一个新数组;并以不同的方式填充行。因此,不要总是具有相同的宽度;您将只为非零值分配空间。然后你会迭代你的整个矩阵;并仅复制非零值。

当然:处理这样的矩阵需要非常精确;因为每个行数组可能有不同的长度!

选项 1(使用列表)具有很大的优势,您可以在创建时进入并删除/添加元素。缺点是:集合仅适用于引用类型;在这种情况下:整数。这意味着一些内存开销。

选项 2 需要显式创建新数组;如前所述:精确处理长度。

【讨论】:

    【解决方案3】:

    您可以将数组设置为String 类型,允许您在想要“删除”元素时将其设置为空字符串 ("")。然后,当您请求元素时,您可以有逻辑忽略任何 ""s 并只取数字。当然,这意味着您需要调用 Integer.valueOf(b[/*indexOne*/][/*indexTwo*/]) 将条目转换为 int 类型,只要您想检索它们。

    此外,如果您想使用int 而不是String 设置元素,则需要以类似的方式使用String.valueOf(/*anInt*/)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多