Возврат массива с каждым другим числом

1

Я пытаюсь сделать программу, которая принимает массив в качестве входных данных и удаляет все нечетные индексы. Он компилируется, но не запускается. По какой-то причине он помещает цикл 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;

    }

}
  • 0
    Пожалуйста, опишите ошибку. Что это говорит?
  • 0
    java.lang.ArrayIndexOutOfBoundsException: 3 at MoreArrayProblems.everyOther (MoreArrayProblems.java:22)
Показать ещё 4 комментария
Теги:

3 ответа

1
Лучший ответ

Вот ваш код как 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. Этот факт, и вышеупомянутый вывод отладки показывают некоторые довольно большие проблемы.

  • 0
    Хорошо, спасибо всем, кто очень помог, мне просто нужно выяснить, как убрать все пустые индексы / нули. Я думаю, что есть код, который до этого сделает это.
  • 0
    Спасибо за большую зеленую галочку!
0
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++;
        }
    }
}
0

Я думаю, что вы хотите использовать '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

  • 0
    «Это будет работать только в том случае, если размер массива a является четным числом ...» Не могли бы вы рассказать об этом немного?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню