Откуда эта программа получает свои числа, и почему это вызвано увеличением размера 1 массива? (Ява)
-
26-10-2019 - |
Вопрос
Эта программа просто должна устранить дубликаты из массива. Тем не менее, вторым для цикла в методе устранения было исключение вне границ. Я смотрел и не мог видеть, как это может быть, поэтому я подумал, что увеличу размер массива на 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 меньше длины вашего массива, чтобы избежать исключения, которое вы получаете, так как массивы на основе нуля. Так что да, короче говоря, <=
должно быть <
.