Java提供二维不规则数组的机制,形式如下——
int[][] twoDimArr = new int[N][];
for(int i=0;i<N;i++){
twoDimArr = new int[M];
}
其中,N和M分别是一维、二维大小,N和M可变。比如打印出一个杨辉三角——
import java.util.Scanner;
public class MainJava {
/**
* @param args
*/
public static void main(String\u005B\u005D args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
final int MAX = in.nextInt();
int[][] odds = new int[MAX][];
for(int i=0;i<MAX;i++){
odds[i] = new int[i+1];
if(i==0){
odds[i][i] = 1;
}else{
for(int j=0;j<=i;j++){
if(j==0||j==i){
odds[i][j] = 1;
continue;
}
odds[i][j] = odds[i-1][j]+odds[i-1][j-1];
}
}
}
for(int[] rows:odds){
for(int cols:rows){
System.out.print(cols+" ");
}
System.out.println();
}
}
}
《Java核心技术卷》评价这种机制为“Java的优势所在”,但实际上,C++的二级指针也能做到类似的效果。使用方式如下——
#include<iostream>
using namespace std;
int main(){
int MAX;
cin>>MAX;
int** arrs = new int*[MAX];
for(int i=0;i<MAX;i++){
arrs[i] = new int[i+1];
if(i==0){
arrs[i][i] = 1;
}else{
for(int j=0;j<=i;j++){
if(j==0||j==i){
arrs[i][j] = 1;
continue;
}else{
arrs[i][j] = arrs[i-1][j]+arrs[i-1][j-1];
}
}
}
}
for(int i=0;i<MAX;i++){
for(int j=0;j<i+1;j++){
cout<<arrs[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
区别在于,C++11所提供的based-range for循环无法应用于指针,所以也无法用形如Java for each的循环(看起来更简洁)来进行输出。因为指针变量本身是没有边界的,所以for循环并不知道循环终止条件是什么。这一点让C++看起来略逊一筹,但实际上,如果使用STL中的容器来写这种代码,C++可以在保证性能的同时更加酷炫。所以我觉得,《Java核心技术卷》中所言,有点言过其实。大胆的猜测一下,Java的这种不规则数组机制实现的底层是否也是使用了一种类似于二级指针的机制呢?我对Java的实现机制并不是很熟悉,先给自己挖个坑,等日后学的通透了再来填。