Для какой цели, в не подлежащей изменению части кода, помещён фрагмент:
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
???
В задании говорится, что выводу на экран подлежат только отсортированные пять чисел. А этот фрагмент выводит первые пять элементов исходного массива.
Или я ошибаюсь?
Vad
36 уровень
Проблемы с выводом
Решен
Комментарии (29)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
VadExpert
26 февраля 2020, 22:07
Во истину повторение -- мать учения...
Глупая ошибка. Прописал
в методе
for(int i=0; i<array.length; i++)
array[i]=arSortDec[i];
и всё наладилось.
Спасибо за помощь!!!!
А что такое "пузырёк"?))))
0
IceBergMaster
26 февраля 2020, 22:38
Самый популярный и простой алгоритм сортировки, но далеко не самый оптимальный.
0
VadExpert
26 февраля 2020, 22:54
Алгоритмами пока не занимался.
Пишу, что в голову придёт. Каждый раз по-разному.
Чужие мысли полезны, только после того, как сам голову поломаешь. )). Когда знаешь, что ищешь. Поэтому особо не гонюсь за новыии разными готовыми коллекциями и т.п. Ещё старый материал не переварился, как следует.
Ещё раз благодарю всех, кто помог разобраться.:-))
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:15
Получается, ошибаешься)
В методе main создаётся массив, в методе sort изменяется. Выводится тот же array, только изменённый операцией sort(array)
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:18
Хотел найти картинку... Но она только путает в данном случае. Вот эту картинку: https://javarush.com/quests/lectures/questsyntax.level02.lecture04 . Но да, там не написано, что массив из main виден в других методах. Однако ты передаёшь его в метод sort и там массив изменяется.
0
VadExpert
26 февраля 2020, 19:28
Да изменяется. Только метод sort не возвращает значения. А т.к. исходный мыссив array[] был создан в методе main, а не в классе, то в методе sort() создаётся его копия и именно она подвергается сортировке. А исходный массив sort() при этом не изменяется, не смотря на то, что оба метода static.
Исходный массив изменяется только при возвращаемом методе sort(). А у нас void по условию...
0
VadExpert
26 февраля 2020, 19:34
Исходный массив изменился бы через метод sort(), если бы он был объявлен в основном классе, а не в методе. Либо, если бы sort() был возвращающим методом, а не void
То, что оба метода static, не имеет никакого значения в этом варианте. Для эксперимента попробуйте объявить переменную в одном из этих методов, а распечатать -- в другом. Получите ошибку.
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:51
Меня этот момент тоже напряг, помню, хотя прошло больше месяца. Ну в данном случае - верь своим глазам. К тому же если бы был return и sort возвращал бы массив, то
всё равно работали бы с первоначальным массивом. 0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:54
Вот, я кое-что тут замутил...
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:55
Такая же ситуация отчасти:
Опять же, видишь, кот передаётся в метод reName, который void. Но имя почему-то легко меняется. 0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 19:57
А вот что нам пишут насчёт того, является ли массив объектом.
Да.
Спецификация языка Java раздел 4.3.1 начинается с:
Объект - это экземпляр класса или массив.
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 20:00
А раз массив является объектом, то, создав его в методе main, ты можешь изменять его в других методах и эти изменения отразятся на первоначальном массиве.
Ведь в параметрах метода ты можешь написать вот так:
т.е. поменять имя переменной, переданной в параметр. Но потом ты всё равно делаешь изменения именно с array (ранее созданным объектом), а работаешь да, с копией superpuper. Вот так вот: 0
IceBergMaster
26 февраля 2020, 20:01
Никакая это не копия, это просто другая переменная, которая ссылается на тот же массив.
0
Евгений Backend Developer в KHAN Group Expert
26 февраля 2020, 20:04
Да, ошибся.
0
IceBergMaster
26 февраля 2020, 20:12
"Получите ошибку" - не получим, есть параметры для передачи объектов из одного метода в другой.
0
VadExpert
26 февраля 2020, 20:45
Но тогда его можно было бы изменить : array = sort(array) перед выводом на печать
или нет?(
0
IceBergMaster
26 февраля 2020, 20:47
Его и так можно изменить - sort(array), без =
0
VadExpert
26 февраля 2020, 20:48
Потому, что переменная в static классе прописана.
А в main создан объект этого класса
0
IceBergMaster
26 февраля 2020, 20:58
Какой static класс? Какой объект?
Напиши код, который у тебя не работает.
0
VadExpert
26 февраля 2020, 20:58
Я сортировал на чистой "математике" , вот так:
public static void
sort(int[] array) {
//напишите тут ваш код
int n = array.length;
/*сортировка по
убыванию:*/
int[] arSortDec =
new int [n];
int k=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=j){
if(array[i]<
array[j]){
k++;
}
}
}
/*расчет поз. равных
элементов : */
arSortDec[k]=array[i];
for(int j=0;j<n;j++) {
if(i!=j){
if(array[i] == array[j]){
k++;
arSortDec[k] =
array[i];
}
}
}
k=0;
} // end 'for' decr
/********/
array=arSortDec;
А принт в мейне закомментировал , перед этим скопировав его в sort().
Валидатор ничего не возразил на принты, но не принял третий (кажется) пункт. Намекает, что сортировка не была произведена. Хотя вывод происходит правильно.
0
IceBergMaster
26 февраля 2020, 21:05
1) Здесь переменная array, которая ссылалась на изначальный массив, теперь ссылается на какой-то новый левый массив, соответственно изначальный массив никак не изменился.
2) А что вывод делает в методе? Задача метода - отсортировать переданный массив. 0
VadExpert
26 февраля 2020, 21:18
array=arSortDec;
это попытка массиву array[] присвоить результаты сортировки чисел по убыванию, находящиеся во временном массиве метода sort().
Теперь. Если распечатываю array прямо в теле sort(), то печатает сортированный массив. Если в main распечатываю вроде бы тот же массив array -- на выходе получается тот первоначальный массив. Отсюда прихожу к выводу, что у каждого из наших static-методов СВОЙ массив с именем array. И никак не могу их связать.
0
VadExpert
26 февраля 2020, 21:19
как можно передать объект из метода, который есть void?
Или как можно предоставить этому методу доступ к объекту другог метода-void для прямого изменения его параметров?
0
IceBergMaster
26 февраля 2020, 21:20
"это попытка массиву array[] присвоить результаты сортировки чисел по убыванию" - ничего подобного не произойдёт, array это переменная, а не сам массив. Есть понимание разницы?
"как можно передать объект из метода, который есть void?" - а зачем на его передавать "ИЗ" метода? Если мы передали его "В" метод, то значит он у нас уже есть и был.
А передать можно просто через параметры, во время вызова метода.
0
VadExpert
26 февраля 2020, 21:24
Да. Но, у меня получается, что метод работает со своей копией объекта, а сам объект не меняет.
0
VadExpert
26 февраля 2020, 21:25
Получается, что изменить исходный массив можно только по одному элементу?
Смысл в том, что через "=" можно только примитивы присваивать?
Попробую.
0
IceBergMaster
26 февраля 2020, 21:26
Значит меняй сам массив, сортировка пузырьком например.
Или да, можно заменить каждый элемент.
+1
VadExpert
26 февраля 2020, 21:35
Попробую. Кажется какие-то мысли появились. Возможно ошибка в том, что операцию присваивания для массивов произвёл, как для примитивов. В итоге изменил ссылку... Но с другой стороны, если ссылке array присвоили новое значение, значит и данные по ссылке должны быть получены другие?
0
VadExpert
26 февраля 2020, 23:05
Интересно, к какому классу относится наш array[]. К Object?
Или Solution? Поразмышляю на досуге.)))
0