我写了一个方法,它将一个数字和一个整数(它将是分隔符)作为输入,该方法将返回一个根据不包括分隔符的分隔符切片的2D数组。 例子:
splitArrayNyNum([0, 0, 0, 3, 1, 1, 1], 3) -> [[0, 0, 0], [1, 1, 1]]
splitArrayNyNum([1, 2, 3, 1, 2, 3, 1, 1, 2, 2, 3, 1], 3) -> [[1, 2], [1, 2], [1, 1, 2, 2], [1]]
splitArrayNyNum([3 , 1 ,3 ,3], 3) -> [[1]]
出于某种原因,当我将鼠标移到方法名称上时,我得到的错误是我的函数应该返回int[][]
这是我的代码:
public static int[][] splitArrayByNum(int[] input, int number){
if (input[0]==number)
for ( int i = 0 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
if ((input[(input.length)-1])==number)
for ( int i = (input.length)-1 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
int count = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == number) {
count++;
}
int[][] result = new int[count][];
int firstindex=0;
int lastindex=0;
for (int j=0; j<input.length; j++){
if (input[j]==number){
result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
firstindex=lastindex=j;
}
lastindex++ ;
}
return result ;
}
答案 0 :(得分:1)
这是因为在{for-loop范围中定义了result
。
请格式化您的代码,您会看到result
在返回语句中不“可见”。
更新: 友好的余数:您可以使用快捷键格式化 eclipse 中的所选代码: Ctrl + Shift + F
格式化代码:
public static int[][] splitArrayByNum(int[] input, int number){
if (input[0]==number)
for ( int i = 0 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
if ((input[(input.length)-1])==number)
for ( int i = (input.length)-1 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
int count = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == number) {
count++;
}
int[][] result = new int[count][];
int firstindex=0;
int lastindex=0;
for (int j=0; j<input.length; j++){
if (input[j]==number){
result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
firstindex=lastindex=j;
}
lastindex++ ;
}
return result ;
}
您可能会发现您没有关闭}
的方法,结果在for-loop
范围内定义,并从那里返回,但我相信您要返回 for循环之后的 ,不是吗?
我认为您的代码应如下所示:
result
另外,我猜您在public static int[][] splitArrayByNum(int[] input, int number){
if (input[0]==number)
for ( int i = 0 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
if ((input[(input.length)-1])==number)
for ( int i = (input.length)-1 ; i < input.length - 1 ; i++ )
{
input[ i ] = input[ i + 1 ] ;
}
int count = 0;
for (int i = 0; i < input.length; i++) /*removed bracket here*/
if (input[i] == number) {
count++;
}
int[][] result = new int[count][];
int firstindex=0;
int lastindex=0;
for (int j=0; j<input.length; j++){
if (input[j]==number){
result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
firstindex=lastindex=j;
}
lastindex++ ;
}
return result ;
}
行中有错误。 result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
可能会大于j
(count
的大小)。所以,你应该有另一个计数器或指向result
数组中最后一个空闲元素的指针(目标是复制下一个数组)。
更新3:
嗯,我不知道它有多公平,但我自己做了所有你的工作。 这是代码,它实际上有效(带注释):
result
我使用接下来的几行来运行它,这就像预期的那样:
public static int[][] splitArrayByNum(int[] input, int number) {
if(input.length == 0) {
return new int[0][];
}
int count = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == number) {
count++;
}
}
if(input[input.length - 1] != number) {
/*we need to add the end of the array manually*/
count ++;
}
int[][] result = new int[count][];
int firstIndex = 0;
int iter = 0;
for (int j = 0; j < input.length; j++) {
if (input[j] == number) {
result[iter++] = Arrays.copyOfRange(input, firstIndex, j);
firstIndex = j+1;
}
}
if(input[input.length - 1] != number) {
/*manually adding the end of the array*/
result[count-1] = Arrays.copyOfRange(input, firstIndex, input.length);
}
return result;
}
此外,在某些时候,您可能有空的部分(分割后)。所以,我让你把它清理干净(如果int[] inp = new int[]{1, 3, 3, 5};
int[][] sp = splitArrayByNum(inp, 3);
for(int i=0;i<sp.length;i++) {
System.out.print(i + ": ");
for(int j=0;j<sp[i].length;j++) {
System.out.print(sp[i][j] + " ");
}
System.out.println();
}
数组中有两个连续的分割数字,它们可能出现在任何地方(不仅在开头或结尾)。