【问题标题】:Printing value at array index returns hashcode在数组索引处打印值返回哈希码
【发布时间】:2014-11-15 08:17:27
【问题描述】:

只是在二维数组中显示值并注意到我的代码打印了一些 hashcodes 然后是值。但我没有打印数组对象本身(如here 帖子中所做的那样)或至少显式调用数组对象的toStringhashcode 方法。相反,我使用arrayObj[i]arrayObj[i][j] 直接访问和打印数组中的值。

这是我的代码:

class PrintTwoDimArray {
    public int [][] createArray () {
        int counter = 0;
        int[][] intArray = new int [2][4];
        for (int i = 0; i < intArray.length; i++) {
            for (int j = 0; j < intArray[i].length; j++) {
                intArray[i][j] = ++counter;
            }
        }
        return intArray;
    }
    public void printArray ( int [][] arrayObj ) {
        for (int i = 0; i < arrayObj.length; i++) {
            System.out.print(arrayObj[i] + " ");
            for (int j = 0; j < arrayObj[i].length; j++) {
                System.out.print(arrayObj[i][j] + " ");
        }
        System.out.println();
        }
    }
}

class TestPrintTwoDimArray {
    public static void main (String[] args) {
    
    PrintTwoDimArray twoDim = new PrintTwoDimArray();
    int [][] multiArray = new int [2][4];
    multiArray = twoDim.createArray();
    twoDim.printArray(multiArray);
    }
}

我的输出如下:

似乎我的代码以某种方式调用了数组的toStringhashcode 方法。想法?如何修改以仅打印值?

javac 和 java 版本 1.8.0

【问题讨论】:

  • 这个字符串是多余的:System.out.print(arrayObj[i] + " ");
  • @nikis 我使用空字符串在值之间创建了一个空格。
  • @sedeh:这不是哈希码:它是存储对象的内存地址。

标签: java arrays int hashcode


【解决方案1】:

二维数组是数组的数组。您创建的数组 (int[2][4]) 如下所示

[ 0 ] -> [ 1, 2, 3, 4 ]
[ 1 ] -> [ 5, 6, 7, 8 ]

因此,当您只访问第一个维度时,您将获得包含第二个维度的数组。

int[][] arr = createArray();
System.out.println(arr[0]);

会输出类似

的东西
[I@1db9742

要打印数组的值,您可以使用Arrays.toString(arr)。在这种情况下,您可以省略内部循环,因为 Arrays.toString() 会为您完成。

 public void printArray ( int [][] arrayObj ) {
    for (int i = 0; i < arrayObj.length; i++) {
        System.out.println(Arrays.toString(arrayObj[i]));
    }
}

【讨论】:

    【解决方案2】:

    哈希值来自您的第一个 System.print 语句。

    System.out.print(arrayObj[i] + " ");

    使用这句话,您正在打印一个 Object(一个数组),因此 Java 正在调用默认的 toString 方法。

    【讨论】:

      【解决方案3】:

      打印时

      arrayObj[i]
      

      您会从数组中获得默认的 Object toString()。您可以使用Arrays.toString(int[]) 将其设为String 之类的

      System.out.println(Arrays.toString(arrayObj[i]));
      

      或者,您可以使用Arrays.deepToString(Object[]) 打印多维数组而无需循环

      System.out.println(Arrays.deepToString(arrayObj));
      

      编辑

      您可以使用格式化输出来构建您的表格。

      public static void printArray(int[][] arrayObj) {
          for (int i = 0; i < arrayObj.length; i++) {
              System.out.printf("%03d: ", i + 1);
              for (int val : arrayObj[i]) {
                  System.out.printf("% 4d ", val);
              }
              System.out.println();
          }
      }
      
      public static void main(String[] args) {
          int[][] table = { { 3, 1, 2 }, { 5, 1, 4 }, { 100, 200, 300 } };
          printArray(table);
      }
      

      输出是

      001:    3    1    2 
      002:    5    1    4 
      003:  100  200  300 
      

      【讨论】:

      • deepToString 工作流畅,我已经注意到了。不过,在这种情况下,我喜欢将值打印为网格。不确定如何在此处实现Arrays.toString(int[]),因为第二个打印语句具有双 int 值。这样的事情是行不通的:System.out.println(Arrays.toString(arrayObj[i][j]))。进一步的想法?
      • @sedeh 编写您自己的toString(int[]),用StringBuilder 构建String,并按照您喜欢的方式对其进行格式化。此外,您的“双整数值”是单个 int 值,位于其数组位置 i,j
      猜你喜欢
      • 2013-06-24
      • 2014-11-14
      • 2021-05-23
      • 2014-11-30
      • 2012-07-22
      • 1970-01-01
      • 2023-04-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多