我想将一维字符串数组转换为二维数组
的行数等于数组元素的数量。
一维数组有许多元素,因此每个元素应该在一行
将自己分成九个元素。
但除了异常之外,输出是一维数组 java.lang.ArrayIndexOutOfBoundsException 9
有人可以帮忙吗?
public class StringFragementation
{
public static String [][] mymethod(String [] mystring)
{
int row = 0, col = 0;
String[][] india = new String[2][9];
String mystringno2[];
mystringno2 = mystring;
int i = 0;
int j = 0;
String x = "_";
int i1;
String Nahda="";
int l;
for( l=0;l<mystringno2.length;l++)
{
Nahda = Nahda.concat(mystringno2[l]);
}
System.out.println( Nahda );
i1 =0;
while (j <Nahda.length())
{
i = Nahda.indexOf(x, i);
i1 = i + 1;
i1 = Nahda.indexOf(x, i1);
if (i1 >Nahda.length())
{
break;
}
i++;
india[row][col] = Nahda.substring(i, i1);
System.out.print("Element " + row + " " + col + " " + india[row][col]+"\t");
col++;
}
return india;
}
public static void main(String[] args)
{
String[] s ={"_Netherlands_Iceland_Norway_Denmark_Usa_Brazil_Argentina_Colombuia_Bolivia","_Belgium_Romania_France_Germany_Switherland_Russia_Sweden_Italy_Austria"};
String [][] singapore = new String[s.length][9];
singapore = mymethod(s);
for(int col=0,k=0;col <9;col++)
for(int row=0;row<s.length;row++)
{
System.out.print( singapore[row][col++]+"\t" ) ;
}
System.out.println("\n");
}
}
答案 0 :(得分:1)
问题是indexOf()
如果找不到字符串则返回-1。现在因为带有国家/地区名称的字符串在最后没有"_"
,indexOf
函数将返回-1。因此,您的循环不会退出,col
将变为9,从而导致IndexOutOfBoundsException
。
我可能错了,但最后在最后添加"_"
尝试。
此外,您永远不会在循环中增加row
,这就是返回数组中只有一个维度的原因。
修改强>
好的,现在我明白了,所以你有18个国家,并希望将它们安排在2行9列。好吧,你永远不会增加row
,这样就行不通了。
试试这个:
public class StringFragementation
{
public static String [][] mymethod(String [] mystring)
{
int row = 0, col = 0;
String[][] india = new String[2][9];
String mystringno2[];
mystringno2 = mystring;
int i = 0;
int j = 0;
String x = "_";
int i1;
String Nahda="";
int l;
for( l=0;l<mystringno2.length;l++)
{
Nahda = Nahda.concat(mystringno2[l]);
}
System.out.println( Nahda );
i1 =0;
// set i before the loop
i = Nahda.indexOf(x, i);
while (j <Nahda.length()) {
i1 = Nahda.indexOf(x, i + 1);
if (i1 == -1) {
// No more "_" we're at the end but we still need to add the last country!
india[row][col] = Nahda.substring(i, Nahda.length() - 1);
break;
}
india[row][col] = Nahda.substring(i + 1, i1);
// set i to the "_" after the current country.
i = i1;
System.out.print("Element " + row + " " + col + " " + india[row][col].toString()+"\n");
col++;
if (col >= 9) {
// we're at the end of the first row, go to second row
col = 0;
row++;
}
}
return india;
}
public static void main(String[] args)
{
String[] s ={"_Netherlands_Iceland_Norway_Denmark_Usa_Brazil_Argentina_Colombuia_Bolivia","_Belgium_Romania_France_Germany_Switherland_Russia_Sweden_Italy_Austria"};
String [][] singapore = new String[s.length][9];
singapore = mymethod(s);
for(int col=0; col < 9;col++)
for(int row=0;row<s.length;row++)
{
System.out.print( singapore[row][col]+"\t" ) ;
}
System.out.println("\n");
}
}
答案 1 :(得分:1)
以下是您的代码的固定版本:
public class StringFragementation
{
public static String [][] mymethod(String [] mystring)
{
int row = 0, col = 0;
String[][] india = new String[2][9];
String mystringno2[];
mystringno2 = mystring;
int i = 0;
int j = 0;
String x = "_";
int i1;
String Nahda="";
int l;
for( l=0;l<mystringno2.length;l++)
{
Nahda = Nahda.concat(mystringno2[l]);
}
System.out.println( Nahda );
i1 =0;
while (j <Nahda.length())
{
i = Nahda.indexOf(x, i);
i1 = i + 1;
i1 = Nahda.indexOf(x, i1);
if (i1 <0)
{
break;
}
i++;
india[row][col] = Nahda.substring(i, i1);
System.out.print("Element " + row + " " + col + " " + india[row][col]+"\n");
col++;
if (col > 8) {
row++;
col=0;
}
}
return india;
}
public static void main(String[] args)
{
String[] s ={"_Netherlands_Iceland_Norway_Denmark_Usa_Brazil_Argentina_Colombuia_Bolivia","_Belgium_Romania_France_Germany_Switherland_Russia_Sweden_Italy_Austria"};
String [][] singapore = new String[s.length][9];
singapore = mymethod(s);
for(int col=0,k=0;col <9;col++)
for(int row=0;row<s.length;row++)
{
System.out.print( singapore[row][col++]+"\t" ) ;
}
System.out.println("\n");
}
}
你忘了切换到新的2D数组(计算列数,如果超过8,增加列并将行重置为0,你也忘了indexOf如果没有找到则返回-1,所以我也修复了
答案 2 :(得分:0)
我建议您将String拆分为令牌而不是取其子串。对于这类问题,它看起来更像C风格的解决方案。怎么样?
public static String[][] mymethod(String[] input) {
String[][] result = new String[input.length][];
for(int i = 0 ; i < input.length ; i++) {
List<String> temp = Arrays.asList(input[i].split("_"));
temp = temp.subList(1, temp.size());
String[] row = new String[temp.size()];
temp.toArray(row);
result[i] = row;
}
return result;
}
希望这有帮助。