例如,想象一下,我想创建一个类似Matlab的矩阵类型,可以使用方括号通过索引访问,并且有一个自定义的toString()方法(所以矩阵A,索引像A [i] [j],它支持print(A)以及可能的其他自定义方法,如追加或删除)。在C ++中,我可以创建一个用数组或向量参数初始化的类,并重载<<和[]运算符来模拟这样的对象。但是如果没有运算符重载,我就会做这样的事情(为不良做法道歉,我已经学习Java大约四个小时了。)
class PrintList {
private int[][] arr;
public PrintList(int[][] a) {
this.arr = a;
}
public String toString() {
String str = "";
for (int i = 0; i != arr.length; ++i) {
for (int j = 0; j != arr[0].length; ++j) {
str += String.format("%5d", arr[i][j]);
}
str += '\n';
}
return str;
}
public int[][] getArr() { return this.arr; }
}
public class Main {
public static void main(String[] args) {
int[][] a = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};
PrintList arr = new PrintList(a);
System.out.println(arr.getArr()[0][2]); // I have to access the array indices by first accessing the array, preventing me from customizing its behavior.
System.out.println(arr); // this works
}
}
这支持sout.print(),但访问数据需要我访问内部数组结构,我希望隐藏在我的“矩阵包装器”中。 “Java-esque”解决方案是基于简单数组(或可能是ArrayLists)使用这样的对象,以及自定义getter和setter方法中的自定义行为,还是有一些其他更优雅的方法来创建自定义数据结构,如这个?我可以继承ArrayList并在子类中实现自定义行为吗?
答案 0 :(得分:0)
在Java中这样的事情是不可能的。
[]
可以访问数组,只有数组。你不能超载它。
我认为这里最好的办法是创建一个这样的实用方法:
public class MatrixHelper {
public static String toString(int[][] matrix) {
// ...
}
}
如果仔细查看JDK,Arrays
就是这样一个类,为1D数组提供各种辅助方法,包括toString
。在Arrays
中,toString
可用于所有基本类型,并且还有一个支持引用类型的通用版本。如果需要,您也可以通过这种方式MatrixHelper
。