java中二维数组赋值的问题!如下代码为什么老是报错java.lang.ArrayIndexOutOfBoundsException: 0
Stringpnr="SKOWXA@1#1#2";String[][]cjrid=null;if(pnr.contains(",")){String[]pnrs=pnr....
String pnr = "SKOWXA@1#1#2";
String[][] cjrid=null;
if(pnr.contains(",")){
String[] pnrs = pnr.split(",");
for(int i=0;i<pnrs.length;i++){
String[] res = pnrs[i].split("@");
cjrid = new String[pnrs.length][res.length];
for(int a=0;a<pnrs.length;a++){
for(int b=0;b<res.length;b++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[a][b]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[0][i]= str;
cjrid[a][b+1]=pnr.substring(0, 6);
}
}
}
}
}
}else{
String[] res = pnr.split("@");
System.out.println(res.length);
cjrid = new String[0][res.length];
for(int i=0;i<res.length;i++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[0][i]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[0][i]= str;
cjrid[0][i+1]=pnr.substring(0, 6);
}
}
}
}
}
我看是二维数组的初始化报错,请问为什么啊?初始化时制定列大小和不知道怎么调试时都一样啊。指定列大小好像没用!
初始化时制定列大小和不制定怎么调试时都一样啊。指定列大小好像没用!
大家讨论讨论就行呵呵呵呵 展开
String[][] cjrid=null;
if(pnr.contains(",")){
String[] pnrs = pnr.split(",");
for(int i=0;i<pnrs.length;i++){
String[] res = pnrs[i].split("@");
cjrid = new String[pnrs.length][res.length];
for(int a=0;a<pnrs.length;a++){
for(int b=0;b<res.length;b++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[a][b]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[0][i]= str;
cjrid[a][b+1]=pnr.substring(0, 6);
}
}
}
}
}
}else{
String[] res = pnr.split("@");
System.out.println(res.length);
cjrid = new String[0][res.length];
for(int i=0;i<res.length;i++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[0][i]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[0][i]= str;
cjrid[0][i+1]=pnr.substring(0, 6);
}
}
}
}
}
我看是二维数组的初始化报错,请问为什么啊?初始化时制定列大小和不知道怎么调试时都一样啊。指定列大小好像没用!
初始化时制定列大小和不制定怎么调试时都一样啊。指定列大小好像没用!
大家讨论讨论就行呵呵呵呵 展开
3个回答
展开全部
用2层循环嵌套就已经很罕见了,值得引起注意。
如果发现自己用到4层、5层,一定是算法出了严重问题。算法效率O(N^4)!!!或者O(N^5)!!!。。。
(如果N等于100,就要算1亿次,几步就挂了) 要改变思路了。。
由于这里只有问题代码,也不知道题意,没法从已有的错往未知的正确上纠正。。
楼上你也别硬撑,觉得“多层嵌套正常”只能反映自己不够重视算法而已。有几个O(L*M*N*O)这样的算法能投入实用?所以这里效率不仅重要而且至关重要。何况你在不明白lz题意的情况去纠正数组越界的表象,可以预见,最多做到治标不治本。
如果发现自己用到4层、5层,一定是算法出了严重问题。算法效率O(N^4)!!!或者O(N^5)!!!。。。
(如果N等于100,就要算1亿次,几步就挂了) 要改变思路了。。
由于这里只有问题代码,也不知道题意,没法从已有的错往未知的正确上纠正。。
楼上你也别硬撑,觉得“多层嵌套正常”只能反映自己不够重视算法而已。有几个O(L*M*N*O)这样的算法能投入实用?所以这里效率不仅重要而且至关重要。何况你在不明白lz题意的情况去纠正数组越界的表象,可以预见,最多做到治标不治本。
追问
算法问题 是要考虑,不过本例的pnr字符串不会超过100个字符。数组长度不会超过4最大4个,应该没什么问题。呵呵谢谢你的建议。
追答
呵呵是的,只是建议呢
像4层高的危楼,楼上的帅哥是在补撑加固。补好了也难保万全。
我一看想到的是拆掉,重新盖好楼
展开全部
cjrid = new String[0][res.length];
初始化有问题,第一个是代表有几个元素,第二个长度代表前一个里面有多少元素
二维数组是一个嵌套数组,如下:
String[][] str = new String[][]{new String[]{"a","b"},new String[]{"a","b"},new String[]{"a","b"}}
也就是说你的数组一维的数组长度为0 那么cjrid[0]当然越界
当改为:cjrid = new String[1][res.length];
初始化有问题,第一个是代表有几个元素,第二个长度代表前一个里面有多少元素
二维数组是一个嵌套数组,如下:
String[][] str = new String[][]{new String[]{"a","b"},new String[]{"a","b"},new String[]{"a","b"}}
也就是说你的数组一维的数组长度为0 那么cjrid[0]当然越界
当改为:cjrid = new String[1][res.length];
更多追问追答
追问
改成1 也是错误的!
追答
改完之后仍然会越界
for(int i=0;i<res.length;i++){ res.length为2
则第二次循环时i为1
cjrid[0][i+1]=pnr.substring(0, 6); 这里会越界
因为不懂你要干吗,所以越界的问题你自己解决
-----------------------------------------------------------
你看好了,指定数组大小后报错位置是不一样的。
你连你要做什么都搞不清楚就来问问题么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要定义二维数组的长度
追问
有长度啊,看代码!!
追答
你上面的这段代码经过断点调测,得出一个结论。在你new “cjrid”这个数组的时候有出现cjrid=new String[0][0],数组长度不能为0;你运行下这段代码,这段代码就是正确的。
String pnr = "SKOWXA@,1#1#2";
String[][] cjrid=null;
if(pnr.contains(",")){
String[] pnrs = pnr.split(",");
for(int i=0;i<pnrs.length;i++){
String[] res = pnrs[i].split("@");
cjrid = new String[pnrs.length][res.length+1];
for(int a=0;a<pnrs.length;a++){
for(int b=0;b<res.length;b++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[a][b]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[0][i]= str;
cjrid[a][b+1]=pnr.substring(0, 6);
}
}
}
}
}
}else{
String[] res = pnr.split("@");
int length=res.length+1;
cjrid = new String[1][length];
for(int i=0;i<res.length;i++){
for(int k=0;k<res.length;k++){
if(k<res.length-1&&res[k].length()==1){
cjrid[1][i]=res[k];
}else if(k==res.length-1){
String str = res[k].split("#")[0];
cjrid[1][i]= str;
cjrid[1][i+1]=pnr.substring(0, 6);
}
}
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询