Попытайтесь понять проблему: есть три шага.
Шаг 1: Получите информацию от пользователя. Продолжайте получать ввод, пока пользователь не введет 0
Шаг 2: Сортировка
Шаг 3: Распечатайте результаты
Шаг 1: Ваша for
петля почти правильная.
Но цикл for должен заканчиваться сразу же после того, как вы получили ввод.
В следующем коде
num[i] = input.nextInt();
var++;
if (num[i] == 0)
break;
вы добавляете пользовательский ввод в массив и затем проверяете, является ли он 0
. Это означает, что 0
также будет частью вашего массива. Если вы не хотите этого, вы должны проверить входные данные и добавить их в массив, только если это не 0
.
Также обратите внимание на объявление i
перед циклом for
. Потому что нам это нужно после цикла for. Зачем? см. ниже.
int i = 0;
for (i = 0; i < NumberOfElements; i++) {
int n = input.nextInt();
if (n == 0)
break;
else
num[i] = n;
} //for loop ends here
Шаг 2: Сортировать
Arrays.sort(num);
Шаг 3: Распечатать вывод:
for (i = 0; i < num.length; i++) {
System.out.print(" " + num[i]);
}
Проблема заключается в том, что на шаге 2 сортируется массив из 1000 элементов, в то время как вам нужно учитывать только количество элементов, введенных пользователем. Вы не знаете, что изначально именно поэтому вы создали массив из 1000 элементов. Но в этот момент (после шага 2) вы do знаете, сколько элементов введено пользователем. Это присутствует в i
Итак, новый шаг между 1 и 2: создайте новые массивы, содержащие только те элементы, которые введены пользователем.
Шаг 1.5:
int[] newArray = Arrays.copyOf(num, i);
Теперь отсортируйте этот новый массив и напечатайте его (так же, как ваш код, но использует только что созданный массив)
Arrays.sort(newArray);
for (i = 0; i < newArray.length; i++) {
System.out.print(" " + newArray[i]);
}
Примечания:
1. Идеальный способ сделать это - использовать списки, а не массивы, но, вероятно, поскольку это домашнее задание, вы можете иметь для использования массивов.
- Поскольку это домашняя работа, я не знаю, разрешено ли вам использовать
Arrays.sort
или Arrays.copy
. Ваш профессор может нахмуриться из-за этого, потому что, возможно, он намеревался изучать конструкции языка через for
, if
и while
. В этом случае вам нужно выполнить шаг 1.5 (сделать массив нужного размера) и выполнить сортировку самостоятельно.
Это не сложно (но просто помните, что это не лучший способ сделать это, кроме домашней работы)
Копировать массив (самодельный) (вместо шага 1.4 выше)
int[] newArray = new int[i]
for(int j=0; j<i; j++){
newArray[j] = num[j];
}
Сортировка (домашняя) (вместо шага 2 выше):
- Перебрать элементы
- Если один элемент больше, чем предыдущий элемент, swap их (в порядке возрастания, элемент prev всегда меньше или равен следующему элементу)
Есть два цикла, потому что вы должны выполнять сравнение на непрерывной основе: первый элемент, сравнить со всем массивом, поместить его в правильное положение, взять второй сравнить со всем массивом и т. Д ...)
for(int j=0; j<newArray.length; j++) {
for(int k=0; k<newArray.length; k++) {
if(newArray[k] > newArray[j]) {
//the swap logic:
int t = newArray[k];
newArray[k] = newArray[j];
newArray[j] = t;
}
}
}
Попытайтесь понять, что на самом деле происходит, вместо того, чтобы просто копировать вставку.
Когда вы поймете логику самодельной сортировки, подумайте об этом:
Второй цикл for в виде or(int k=0; k<newArray.length; k++) {
может быть просто for(int k=0; k<newArray.length; k++) {
. Почему?
Ваш цикл печати останется таким, каким вы его написали, но вы будете печатать newArray
вместо num
. Возможно, вы захотите изменить переменную цикла на int j
или что-то еще, но i
также будет работать. (i
содержит количество входов сейчас, поэтому я бы не стал использовать его для каких-либо других целей. Но это просто способ кодирования. Технически нет разницы - код будет работать так же)
Я не объединяю части. Я оставлю это тебе, иначе будет похоже, что я сделал твою домашнюю работу: -)