Java重写toString 使之可以输出二维数组

Java重写toString 使之可以输出二维数组

java的标准API中的Array类没有toString方法,因此沿用父类Object的toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
而Array类中的方法几乎全是本地方法,可以说Array类就是一个本地类,因此他不受java语法约束,也根本无法用java语法改写toString方法,想要改写这个类实在是太难了,我是不会..
但是你可以使用java.util.Arrays类中的deepToString(Object o[])静态方法,可以实现打印多重数组。
举个例子:
int[][][] a=new int[3][4][5];
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
for(int k=0;k<5;k++){
a[i][j][k]=i*j*k;
}
}
}
System.out.println(Arrays.deepToString(a));
java设计人员之所以不为Array类设计toString是因为不好确定用什么方式打印数组,是用“【”,还是用“{”,以及要不要“,”等都是问题。
Arrays的deepToString方法如下:

public static String deepToString(Object[] a) {
if (a == null)
return "null";

int bufLen = 20 * a.length;
if (a.length != 0 && bufLen <= 0)
bufLen = Integer.MAX_VALUE;
StringBuilder buf = new StringBuilder(bufLen);
deepToString(a, buf, new HashSet());
return buf.toString();
}

private static void deepToString(Object[] a, StringBuilder buf,
Set<Object[]> dejaVu) {
if (a == null) {
buf.append("null");
return;
}
dejaVu.add(a);
buf.append('[');
for (int i = 0; i < a.length; i++) {
if (i != 0)
buf.append(", ");

Object element = a[i];
if (element == null) {
buf.append("null");
} else {
Class eClass = element.getClass();

if (eClass.isArray()) {
if (eClass == byte[].class)
buf.append(toString((byte[]) element));
else if (eClass == short[].class)
buf.append(toString((short[]) element));
else if (eClass == int[].class)
buf.append(toString((int[]) element));
else if (eClass == long[].class)
buf.append(toString((long[]) element));
else if (eClass == char[].class)
buf.append(toString((char[]) element));
else if (eClass == float[].class)
buf.append(toString((float[]) element));
else if (eClass == double[].class)
buf.append(toString((double[]) element));
else if (eClass == boolean[].class)
buf.append(toString((boolean[]) element));
else { // element is an array of object references
if (dejaVu.contains(element))
buf.append("[...]");
else
deepToString((Object[]) element, buf, dejaVu);
}
} else { // element is non-null and not an array
buf.append(element.toString());
}
}
}
buf.append(']');
dejaVu.remove(a);
}
}
java.lang.reflect.Array类的内容如下,你如果有能力可以改改:
/*
* @(#)Object.java 1.73 06/03/30
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

package java.lang;
public class Object {

private static native void registerNatives();
static {
registerNatives();
}

public final native Class<?> getClass();

public native int hashCode();

public boolean equals(Object obj) {
return (this == obj);
}

protected native Object clone() throws CloneNotSupportedException;

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}

if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}

wait(timeout);
}

public final void wait() throws InterruptedException {
wait(0);
}

protected void finalize() throws Throwable { }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-10
public class ChongXie {

String[][] ns;

@Override
public String toString() {
String result = "";
if (ns == null) {
throw new NullPointerException();
}
for (String[] x : ns) {
for (String y : x) {
result += y + "\t";
}
result += "\n";
}
return result;
}
}

测试类
public class Test {
public static void main(String[] args) {
String[][] n = { { "1-1", "1-2" }, { "2-1", "2-2" } };
ChongXie cx = new ChongXie();
cx.ns = n;
System.out.println(cx);
}
}
打印结果:
1-1 1-2
2-1 2-2
这个没什么意思,一般不要随便重写toString().
第2个回答  2010-04-10
toString方法返回类型是String,如果你想输出二维,只能在toString方法中手动打印输出。
第3个回答  2010-04-10
首先,toString是Object的方法,Java的二维数组不是对象吧……所以……
第4个回答  推荐于2016-12-01
我写了一个print(int[][] a)方法

public static void print(int[][] a) {
for(int i=0; i<a.length; i++) {
for(int j=0; j<a[i].length; j++) {
System.out.print(a[i][j] + " ");
}
}
}本回答被提问者采纳