Я пытаюсь сделать программу, которая принимает массив в качестве входных данных и удаляет все нечетные индексы. Он компилируется, но не запускается. По какой-то причине он помещает цикл while. Я не уверен, как решить эту проблему.
благодаря
public class MoreArrayProblems
{
public int[] everyOther (int [] a){
if (a.length < 2){
return a;
}
int []l = new int[a.length/2];
//if (a.length%2==0) {int l[]= new int [a.length/2];}
//else {l[] = int [a.length + 1 / 2];}
int loc= 0, i = 1;
while ( i<a.length){
l[i] = a[i-1]; //for some reason this doesn't work
i += 2;
}
return l;
}
}
Вот ваш код как SSCCE с добавлением полезной инструкции для отладки.
import java.util.Arrays;
public class MoreArrayProblems
{
public static final void main(String[] ignored) {
System.out.println(Arrays.toString(
(new MoreArrayProblems()).everyOther(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})));
}
public int[] everyOther (int [] a){
if (a.length < 2){
return a;
}
int []l = new int[a.length/2];
//if (a.length%2==0) {int l[]= new int [a.length/2];}
//else {l[] = int [a.length + 1 / 2];}
int loc= 0, i = 1;
while ( i<a.length){
System.out.println("l.length=" + l.length + ", a.length=" + a.length + ", i=" + i + ", [i - 1]=" + (i - 1) + "");
l[i] = a[i-1]; //for some reason this doesn't work
i += 2;
}
return l;
}
}
Вывод:
[C:\java_code\]java MoreArrayProblems
l.length=5, a.length=10, i=1, [i - 1]=0
l.length=5, a.length=10, i=3, [i - 1]=2
l.length=5, a.length=10, i=5, [i - 1]=4
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at MoreArrayProblems.everyOther(MoreArrayProblems.java:21)
at MoreArrayProblems.main(MoreArrayProblems.java:5)
Первый элемент в массиве имеет индекс 0
, а не 1
. Этот факт, и вышеупомянутый вывод отладки показывают некоторые довольно большие проблемы.
public class MoreArrayProblems {
public static void main(String[] args) {
int divider = 2;
int[] a = {100, 200, 300, 400, 500, 600};
int[] l = new int[a.length/divider];
int i = 0;
while ( i<l.length){
l[i] = a[i*divider];
System.out.println(l[i]);
i++;
}
}
}
Я думаю, что вы хотите использовать 'loc' для вашего массива 'l'. Что-то вроде этого:
public int[] everyOther(int[] a) {
if (a.length < 2) {
return a;
}
int[] l = new int[a.length / 2];
int loc = 0, i = 0;
System.out.println("size: " + a.length);
while (i < a.length) {
if (!isOdd(a[i])){
l[loc] = a[i];
loc++;
}
i++;
}
return l;
}
Это функция isOdd
public boolean isOdd(int number) {
return number % 2 != 0;
}
Поскольку l.lenght
задан как a.length/2
этот код будет работать только в том случае, если размер массива a
является четным числом. Например, если a.legth
= 9, то l
будет только 4, и это вызовет java.lang.ArrayIndexOutOfBoundsException
при выполнении цикла while