Откуда эта программа получает свои числа, и почему это вызвано увеличением размера 1 массива? (Ява)

StackOverflow https://stackoverflow.com/questions/8335998

Вопрос

Эта программа просто должна устранить дубликаты из массива. Тем не менее, вторым для цикла в методе устранения было исключение вне границ. Я смотрел и не мог видеть, как это может быть, поэтому я подумал, что увеличу размер массива на 1, чтобы я заставил бы его работать с единственным недостатком, являющимся дополнительным 0, прикрепленным к концу.

К моему удивлению, когда я увеличил размер Tracker [] с 10 до 11, программа распечатывает каждое число от 0 до 9, даже если я не наложу большинство из этих чисел. Откуда эти цифры и почему у меня эта проблема?

import java.util.*;
class nodupes 
{
    public static void main(String[] args) 
    {   

        int[] dataset = new int[10];


        //getting the numbers
        for (int i = 0; i <= 9 ; i++)
        {
            Scanner input = new Scanner(System.in);
            System.out.println("Enter a one digit number");
            dataset[i] = input.nextInt();
        }

        int[] answer = (eliminateduplicates(dataset));
        System.out.println(Arrays.toString(answer));
    }

    public static int[] eliminateduplicates(int[] numbers)
    {

        boolean[] tracker = new boolean[11];
        int arraysize = 1; 
        for(int k = 0; k <= 9; k++)
        {

            if(tracker[numbers[k]] == false)
            {
                arraysize++;
                tracker[numbers[k]] = true;
            }

        }
        int[] singles = new int[arraysize];

        for(int l = 0; l <= arraysize; l++)
        {
            if(tracker[l] == true)
            {
                singles[l] = l;

            }


        }

        return singles;
    }
}    

Исключение произошло в этой части

     if(tracker[l] == true)

Но только когда размер трекеров составлял 10. В 11 он только печатает [0,1,2,3,4,5,6,7,8,9]

РЕДАКТИРОВАТЬ: массив = 1 был удержанием от отладки, изначально он был в 0

РЕДАКТИРОВАТЬ: Исправьте это, но теперь в конце есть 0, хотя массив должен быть полностью заполнен.

public static int[] eliminateduplicates(int[] numbers)
{

    boolean[] tracker = new boolean[10];
    int arraysize = 0; 

    for(int k = 0; k < numbers.length; k++)
    {

        if(tracker[numbers[k]] == false)
        {
            arraysize++;
            tracker[numbers[k]] = true;
        }

    }
    int[] singles = new int[arraysize];
    int counter = 0;

    for(int l = 0; l < arraysize; l++)
    {
        if(tracker[l] == true)
        {
            singles[counter] = l;
            counter++;
        }


    }

    return singles;
}
Это было полезно?

Решение

Редактировать как 20, потому что я действительно должен спать. Понимая, что я, вероятно, только что сделал для вас домашнее задание, поэтому я снял код.

Массивы должны начинаться с 0, потому что вы начинаете без чисел и начинаете добавлять к этому размеру, когда вы находите дубликаты. Предполагая, что было только 1 номер, повторяемый десять раз, вы бы создали массив размера 2 для хранения 1 номер. int arraysize = 0;

Ваш первый для петли должен пройти через numbers, поэтому имеет смысл использовать длину чисел в ограничении цикла. for( int i = 0; i < numbers.length; i ++)

Для второго для цикла: вам нужно пройти все tracker массив, так же может использовать длину для этого (tracker.length) Меньше волшебных чисел - это всегда хорошая вещь. Вам также нужны другие переменные, чтобы отслеживать ваше место в singles множество. Если бы числа были массивом 10 9 с, то только трекер [9] был бы правдой, но это должно быть помещено в одиночек [0]. Опять же, плохая работа от меня объяснения, но это тяжело без диаграмм.

DERP DER

public static int[] eliminateduplicates(int[] numbers)
{
    boolean[] tracker = new boolean[10];
    int arraysize = 0; 

    for(int k = 0; k < numbers.length; k++)
    {
        if(tracker[numbers[k]] == false)
        {
            arraysize++;
            tracker[numbers[k]] = true;
        }
    }

    int[] singles = new int[arraysize];

    for(int l = 0, count = 0; l < tracker.length; l++)
    {
        if(tracker[l] == true)
        {
            singles[count++] = l;
        }
    }

    return singles;
}

Другие советы

Поскольку массивы начинаются с 0, ваш массив будет больше, чем количество уникальных чисел, поэтому ваш последний цикл проходит слишком много раз. Другими словами «L» (буква L-Попробуйте использование другого имени переменной), будет достигнуто 11, если у вас есть 10 уникальных чисел, а трекер имеет только элемент 0-10, что является исключением вне границ. Попробуйте изменить объявление на int в массивах = 0;

Еще раз победил <=

for(int l = 0; l <= arraysize; l++)

Размер массива 10 означает 0-9, эта петля пойдет 0-10

Для откуда числа, от,

singles[l] = l;

присваивает значения подсчета в одиночные поля, поэтому синглы [1] назначаются 1 и т. Д.

Я чувствую, что вы делаете слишком много обработки, чтобы получить дубликат, если у вас нет ограничения, не используя коллекции, вы можете попробовать это

public class NoDupes {
    public static void main(String[] args) {
        Integer[] dataset = new Integer[10];
        for (int i = 0; i < 10; i++) {
          Scanner input = new Scanner(System.in);
          System.out.println("Enter a one digit number");
          dataset[i] = input.nextInt();
        }
        Integer[] arr = eliminateduplicates(dataset);
        for (Integer integer : arr) {
           System.out.println(integer);
        }
    }

     public static Integer[] eliminateduplicates(Integer[] numbers) {
        return new HashSet<Integer>(Arrays.asList(numbers)).toArray(new Integer[]{});
     }
}

Чтобы ответить на ваш вопрос, ваш окончательный цикл становится одним указанием больше, чем размер.

Диапазон действительных индексов в массиве в Java [0, SIZE), т.е. от 0 до arraysize-1.

Причина, по которой вы получаете исключение, заключается в том, что в вашем цикле вы итерации от 0 до arraysize включительно, 1 индекс слишком далеко:

for(int l = 0; l <= arraysize; l++)

Поэтому, когда вы добираетесь до if(tracker[l] == true) в последней итерации, l будет равным arraysize а также tracker[l] будет за пределами массива. Вы можете легко исправить это, изменив <= к < в твоей for Условие петли.


Причина, по которой проблема исчезает, когда размер вашего массива изменяется с 10 на 11 arraysize увеличить до 10 в for петля над тем, что вызывает проблемы. В это время, singles[10] является действительным элементом в массиве, поскольку диапазон индексов в вашем массиве сейчас [0, 11).

РЕДАКТИРОВАТЬ: Фактически arraysize может быть увеличен до 11, я подумал, что это инициализировано до 0, и в этом случае это будет только до 10. В любом случае, вышеуказанное все еще действителен; Последний индекс, который вы пытаетесь и получить доступ в своем массиве, должен быть на 1 меньше длины вашего массива, чтобы избежать исключения, которое вы получаете, так как массивы на основе нуля. Так что да, короче говоря, <= должно быть <.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top