Самые-самые

  • 10
  • Недоступна
Игры со списками в Java очень популярны. А всё потому, что это просто и интересно. Присоединяйтесь! В этой задачке создаем список строк. Затем — добавляем в него 10 строчек с клавиатуры. Самое интересное — определяем, какая строка в списке встретится раньше: самая короткая или самая длинная. Если таких строк несколько, учитываем самые первые из них.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (302)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Kateryna Spasova8 уровень, Киев
17 февраля, 12:15
не пропускал валидатор только потому, что я присвоила значения String maxString = ""; String minString = ""; 😆 присваивайте значения в цикле
Роман Зверев7 уровень, Днепр
позавчера, 14:40
Всё дело в том что переменные объявлены в методе main и являются локальными. По умолчанию локальные переменные НЕ содержат значений по умолчанию (0 для int / null для String / false для boolean ...), поэтому инициализация локальных переменных происходит явно (например, String maxString = ""; / String maxString = null;). Инициализация по умолчанию (0 для int / null для String / false для boolean ...) происходит только для переменных экземпляра (т.е. те, которые объявлены внутри самого класса, а не методов). (Head First - Изучаем Java глава 4 стр 114)
Дмитрий кул Хацкер8 уровень, Минск
12 февраля, 14:06
Как же просто решается эта задача. А я потратил наверное пол дня, чего только не делал, куча каких-то ненужных циклов и переменных. Затупил с условием задачи, пытался вывести все минимальные либо максимальные строки, а нужно было только одну первую строку. Плюс к этому ОЧЕНЬ СИЛЬНО ПОМОГЛО упоминание здесь в комментах про прерывание цикла если условие выполняется в первый раз. Всем успехов, если кому нужно будет подсмотреть у меня решение, пишите, пришлю в личку.
Chingiz12 уровень
6 февраля, 20:33
Алгоритм такой: Ввожу строки параллельно в три списка, один список строк, второй список длин строк, третий также список длин, только с сортировкой больше - меньше. Беру из отсортированного списка крайние (первое и последнее) значения. Запускаю цикл оставшихся списков на соответствие крайнему значению, по получении индекса, выдаю строку и останавливаю цикл. Итого два цикла. Есть более короткий алгоритм?
Александр Назаров27 уровень, Москва
12 февраля, 14:23
Решил в 2 строчки через стримы.
Chingiz12 уровень
12 февраля, 17:42
О... стримы... знать бы что это.
Александр Назаров27 уровень, Москва
13 февраля, 08:13
уверен, еще узнаешь) Просто ты спросил про более короткий способ решения ^_^
Максим9 уровень, Алматы
2 февраля, 12:32
Мое решение было такое: 1) создал 2 переменные min и max, для записи индекса самой маленькой строки и самой большой строки 2) сравнил их между собой, и вывел результат которая меньше вывел list.get( min или max)
Oleg Goryachev13 уровень, Санкт-Петербург
31 января, 21:14
Друзья, уже голову сломал. Помогите, пожалуйста. Почему самая длинная строка у меня читает не с 0 индекса, а с 1го. И почему в итоге не рабтает?
Денис8 уровень
1 февраля, 12:53
Скинь код в лс
Серегй11 уровень, Москва
30 января, 08:21
вопрос знатокам, решил задачу но валидатор не засчитывает пункт 3-5. подскажите в чем косяк, ведь с условием задачи справился и проверял на своих примерах все ок?
Pavel Mironov (Miroha)16 уровень, Москва
30 января, 08:00
Такого решения здесь вроде не видел, поэтому выкладываю (вроде как самое короткое из предложенных):
String max = Collections.max(list, Comparator.comparing(String::length));
String min = Collections.min(list, Comparator.comparing(String::length));
System.out.println((list.indexOf(max) < list.indexOf(min)) ? max : min);
Кристина13 уровень, Могилев
6 февраля, 07:04
Доброго времени суток! Вы можете объяснить как работает этот код и как его правильно читать?
Pavel Mironov (Miroha)16 уровень, Москва
6 февраля, 11:13
Приветствую, Код объяснить могу, а вот как его правильно читать - вряд ли, так как это приходит с опытом. 1, 2) Для работы с коллекциями есть вспомогательный класс Collections. В нем есть статические методы, в которых содержатся некие алгоритмы: найти минимальный/максимальный элемент в коллекции, отсортировать её, перемешать элементы случайным образом и т.д. Так вот, мы хотим найти самую длинную и короткую строки. Как? Узнав её длину. Для этого мы вызываем метод max (min) у класса Collections. Метод на вход принимает два параметра: список, над которым нужно совершить действие (это list) и некий компаратор. Компаратор - это такой интерфейс, реализовав который, мы можем написать свой алгоритм для сортировки. У компаратора есть и свои методы, в данном случае используется comparing. Как бы странно это ни звучало, данный метод возвращает тот же компаратор, только с уже заданным алгоритмом "как сравнивать". На вход он принимает нашу строку (String), объект с которым он будет работать. Через :: мы указываем как сравнивать - по их длине, метод length. Т.е. он будет пробегаться по каждой строке списка и смотреть её длину. Найдет их и запишет в наши переменные. 3) Тут всё просто. В две строковых переменных мы записали самую длинную и самую короткую строки. Мы обращаемся к исходному списку list и вызываем метод indexOf. На вход методу мы передаем наши две строки. Метод indexOf возвращает индекс (число) первого совпадения. Т.е. как только наша строка (max или min) совпадет с элементом из списка, метод завершит свою работу и вернет индекс этой строки в списке. Еще здесь используется тернарный оператор (для сокращения кода). Мы сравниваем, а какой индекс меньше? Самой длинной или самой короткой строки? Если индекс строки max будет меньше, значит она встречается в списке раньше, тогда мы возвращаем эту строку, иначе строку min.
Кристина13 уровень, Могилев
6 февраля, 16:55
Спасибо за объяснение! Надеюсь со временем, придет более глубокое понимание)
Pavel Mironov (Miroha)16 уровень, Москва
6 февраля, 17:34
Да не за что :) Я первые два месяца вообще мало что понимал в языке. У меня было несколько подходов к программированию ранее, но бросал на второй же неделе. Прижало и я вернулся к программированию. Java изучаю 6 месяц, сейчас спокойно читаю исходники, документацию и прочее. Тут главное побороть такое чувство, которое возникает, если ничего не понимаешь и не можешь ничего решить. Когда оно возникает, просто хочется все бросить и кажется, что ты слишком тупой для этого дела. Если перебарывать в себе такие моменты и морально отдыхать, то успех придет. Я думаю, что многие не справляются с этим, поэтому быстро бросают подобные начинания.
Алексей С7 уровень
четверг, 15:52
Звучит воодушевляюще. Подбодрил.
com.Mortalitasi7 уровень, Кишинев
пятница, 21:26
отличное решение
Сергей8 уровень, Ekaterinburg
28 января, 11:29
Дело не в том как вывести, а в том какую строку вывести. Ведь нужно вывести самую короткую, которая раньше была самой длинной и наоборот. Когда было и что с ней стало совершенно неизвестно? Именно поэтому непонятно что делать.
Анастасия11 уровень, Москва
22 января, 13:59
Если все написали, но не знаете, как вывести 1 строку, а не 2 (минимальную и максимальную), в прошлых лекциях нам показывали, с чьей помощью можно приостановить программу в нужный момент: break;
Dmitry Moiseev8 уровень, Казань
26 января, 10:46
можно еще return использовать) приостановит всю программу, если я правильно помню)
Андрей10 уровень, Москва
16 января, 20:30
Господа, тут большинство ищет максимальную и минимальную строку сравнивая последовательно длины строк с int max и int min и если они больше(меньше) то значения переписываются. Причем изначально max =0, min =9999(любое большое число). Это неверное решение, поскольку длины строк всегда могут оказаться больше min. В чем суть поиска минимума? Нужно взять первый элемент и последовательно сравнить с каждым, меняя их местами, если второй окажется меньшим. Но при написании цикла возникает трудность поскольку первом цикле первый элемент не с чем сравнивать. Вот и приходит такая дурная идея присваивать значению min "большое число". А надо всего лишь сделать так, чтобы константе min присвоить длину первой строки(это касается и max). Для этого выведем первый оборот цикла и напишем его ручками; min присвоить длину первой строки. И продолжим цикл со второго значения счетчика.
Max Nechaev15 уровень, Selyatino
19 января, 06:55
min можно присвоить максимальное значение int (min=Integer.MAX_VALUE) для max отлично подходит 0