【问题标题】:print 2 dimentional array center aligned打印二维数组中心对齐
【发布时间】:2014-07-04 01:32:01
【问题描述】:

您好,我正在尝试打印一个中心对齐的二维数组,但如果我正确,数字指向内存单元。我将如何让他们打印实际数字,我尝试创建一个显示方法,但没有奏效。到目前为止,这是我的代码。在弄清楚这一点后,我还将找到最小值、最大值和平均值。

import java.util.Scanner;

public class Print2DArray {

public static void main(String[] args) {

    Scanner print2d = new Scanner(System.in);
    System.out.println("Please enter the number of rows: ");
    int rows = print2d.nextInt();
    System.out.println("Please enter the number of columns: ");
    int columns = print2d.nextInt();

    int array[][] = new int[rows][columns];

    System.out.println("\nVictor  - 002017044\n");

    for (int x = 0; x < array.length; x++) {
        for (int y = 0; y < array[x].length; y++) {
            int value = (int) (Math.random() * 10000);
            value = (int) (Math.round((value * 100)) / 100.0);
            array[x][y] = value;
        }
    }

    for (int x = 0; x < array.length; x++) {
        for (int y = 0; y < array[x].length; y++) {
            printArray(array);
        }
        System.out.println();
    }


    int max = 0;
    int avg = 0;
    int min = 0;

    System.out.println("\nMaximum: " + max + "\nAverage: " + avg
            + "\nMinimum: " + min);
}

private static void printArray(int [][] array){
    int width = 6;
    int leftSP = (width - array.length)/2;
    int rightSP = width - array.length - leftSP;
    for (int i = 0; i < leftSP; i++) {
        System.out.print(" ");
    }
        System.out.print(array);
    for (int i =0; i < rightSP; i++) {
        System.out.print(" ");
    }
}
}

【问题讨论】:

  • center aligned 是什么意思?您正在创建一个由数字组成的 矩形。使用小数组发布预期结果。
  • 我的意思是像这样tinypic.com/r/2a7bp1k/8
  • 好的。为此,您只需要使用formatting
  • 什么是居中对齐?另外,如果您只想打印数组,为什么要使用单独的 printArray 函数?而不是函数调用,你可以只打印值吗?即替换 printArray(array);与 System.out.print(array[x][y]);

标签: java arrays methods printing


【解决方案1】:

在这种情况下,我不太清楚您所说的居中对齐是什么意思。将某些内容居中需要您知道允许打印到多少空间,然后将您显示的内容均匀地分布到宽度/2 的两侧。例如,默认情况下,在 cmd.exe 中限制为 80 个字符,但这可以更改。但是,我认为这个答案的核心在这里: Can I find the console width with Java?

基本上,您无法将其居中。您可以期望的最好的结果是左对齐(或尝试根据任意预先确定的宽度将其居中)。

根据您写的内容以及我在 printArray 中看到的内容,您的另一个问题是您不知道如何在数组的索引处打印出一个值。在我说这个之前,我必须先说一下你写的东西

但是如果我正确的话,数字会指向记忆单元

这实际上是不正确的。这是 toString 方法的默认功能,根据 java.lang.Object#toString 方法:

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,这个方法返回一个字符串等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString%28%29

您的打印方法应该如下所示:

private static void printArray(int [][] array){
    if(array == null || array.length < 1 || array[0].length < 1)
        throw new IllegalArgumentException("array must be non-null, and must have a size of at least \"new int[1][1]\"");
    for (int i = 0; i < array.length; i++) {
        for(int j = 0; j < array[0].length; j++)
            System.out.print("[" + array[i][j] + "]");
        System.out.println();
    }
}

编辑: 我看到您发表的评论中指定了居中对齐的含义。基本上你会想要记录你放入数组中的任何 int 的最大长度,如下所示:

//global max value
public static int maxLength = 0;
...
    //inside of Print2DArray.main(String [] args)
    for (int x = 0; x < array.length; x++) {
        for (int y = 0; y < array[x].length; y++) {
            value = (int) (Math.round((value * 100)) / 100.0);
            int numberOfDigits = String.valueOf(value).length();
            if(numberOfDigits > Print2DArray.maxLength)
                Print2DArray.maxLength = numberOfDigits;
            array[x][y] = value;
        }
    }

然后你会想要调整你的 printArray 函数的打印从

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

System.out.printf("[%" + Print2DArray.maxLength + "d]", array[i][j]);

【讨论】:

    【解决方案2】:

    首先修复错误

    for (int y = 0; y < array[x].length; y++) {
        printArray(array[x][y]);//chage printArray(array) to printArray(array[x][y])
    }
    

    第二次修改printlnArray

    private static void printArray(int v){
         System.out.format("%-8s",String.valueOf(v));
    }
    

    居中对齐

    private static int[] widthes = {9,99,999,9999,99999};
    private static int numberWidth(int v) {
        for (int i = 0; i < widthes.length; i++) {
          if(widthes[i] > v) return (i+1);
      }
        return -1;
    }
    private static void printArray(int v){
        int width = 8;
        int numberWidth = numberWidth(v);
        int left = (width-numberWidth)/2;
        int right = width - numberWidth - left;
        for (int i = 0; i < left; i++) {
            System.out.print(" ");
      }
        System.out.print(v);
        for (int i = 0; i < right; i++) {
            System.out.print(" ");
        }
    }
    

    更多参考 How to align String on console output

    【讨论】:

    • 这会起作用,但这只会将它向右或向左对齐,我试图使数字居中。
    • 没有完全居中对齐。例如。在 8 宽单元格中显示 123。向左填充 2 个空格,向右填充 3 个空格;
    • 如果你使用 groovy。 Groovy 为 String groovy.codehaus.org/groovy-jdk/java/lang/… 添加中心方法
    • 我发现了我的问题@Sam。我所要做的就是将 int 转换为字符串,然后修改 printfield 方法以接收字符串和 int(宽度)。现在想想,这是一个非常简单的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2015-02-03
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多