Блог пользователя Gentleman

Автор Gentleman, 13 лет назад, По-русски

Добрый день, уважаемое сообщество CF

Хотелось бы знать какие средства языка программирования Java нужно знать, чтобы это было достаточно для решения задач по СП?

Например:

  1. Массивы
  2. Строки
  3. Коллекции ( Set, Map, и т. д.)
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
4. Ввод / вывод
5. Классы, интерфейсы, наследование
6. Элементарный парсинг
7. Сравнение объектов
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Зачем для спортивного программирования все тонкости ООП в Java? Максимум что нужно - уметь создать внутренний статический класс чтобы пользоваться им вместо сишной структуры, да реализовать метод предка/интерфейса (т.е. понимать требования контрактов к этим интерфейсам или предкам).

    Я б рекомендовал посмотреть на решения клыкастых спортсменов - чем пользуются они.

    Полезно уметь пользоваться встроенными регэкспами, хоть это и не всегда нужно.

    Для ряда коллекций важно уметь реализовывать (возможно в анонимных классах) требуемые интерфейсы.

    Кроме "Строки" я бы добавил вообще все объекты и интерфейсы связанные с основными структурами данных: Integer, Double, BigInteger, Number, StringBuilder, CharSequence. Класс Math.

    Вообще очень важно внимательно изучать возможности API. Чтобы инвенциями в деле бициклизма не заниматься во время соревнований ;-)

    В общем главное ввязаться (и по возможности решать не только спортивные задачки) - там разберётесь и, вероятно, много полезняшек найдёте.
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Я не писал обо "всех тонкостях". Например, как подсказали ниже, Comparable<self> классы бывают очень удобны, и надо понимать, к чему пишется тот или иной метод.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ООП? Очевидно чтобы делать дерево отрезков декартовых деревьев. :D
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        interface Drevo<E>;

        abstract class CartesianDrevo<E> implements Externalizable;

        class ZachotnoCartesianDrevo extends CartesianDrevo
        <? extends Map<? extends Drevo>>
        implements Closeable, Listable, Mappable, Drevable;
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как сказал не очень уважительно один мой знакомый, "Джава нужна, когда на плюсах влом писать длинку".
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    По-моему автор позабыл у вас/нас спросить писать ему на плюсах или на яве, так что не стоит снова-здорова холивары начинать...
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Например, такая мелочь, как написать Comparable класс.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Ну... Можно вместо него анонимный Comparator написать... и вообще не Comparable и Comparator а Comparable<T> и Comparator<T>... Хотя думаю что дело ограничится только ворнингами и будет пропущено... Но смысл в том что минимальное понимание женериков может пригодиться...
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Массивы, строки, контейнеры, все функции Arrays.*, Collections.*, String.* и оберточных классов (Integer.*, Double.*, ...), StringBuilder, BigDecimal, BigInteger, Math.*, Comparator, Comparable, equals, break/continue с метками
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    >break/continue с метками
    Не учите человека плохому.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Иногда удобно бывает выйти из сложенных циклов сделав break global, к примеру.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ну дык эта штука для вложенных циклов и придумана была.  Впрочем в некоторых конторах могут требовать все break/continue делать с метками, т.к. существует нечастая, но достаточно типичная ошибка:

        При модификации исходников (не то чтоб длинных, но если тело метода не влезает в 1 экран) некий фрагмент оказывается необходимым забрать в цикл (например для обработки каких-то проблем, выдачи повторного запроса пользователю и т.п.) - и тут оказывается, что фрагмент содержал break/continue (от внешнего цикла или свитча). Брейк оказывается теперь во внутреннем цикле и естественно что и внешняя и внутренняя конструкция ведут себя не вполне адекватно.

        Притом такой косяк довольно легко упустить.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ок, это всё понятно. Но мы вроде обсуждали олимпиадный код? Причем тут конторы?
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            ах да, я и забыл что олимпиадный код всегда пишется без ошибок... :-)
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Писать нужно в Far, без дебагера и сразу правильно (с)
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Это волшебство какое - то, чтобы сразу все правильно заработало :)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Скажи еще в C++ не использовать goto, я рассмеюсь тебе в лицо :о)

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Только, пожалуйста, не надо метками эмулировать обычные циклы, конструкции if-else и прочее. Видел такой код, знаю, блевал. =)
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          откройте ради интереса стандартную реализацию qsort в С)
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Угости ссылочкой что ли.

            P.S. лучше меня на "ты".
            • 13 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Не нашел в нете, но при желании можно у себя на локалке поискать)
              вот реализация майкрософта. 
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Автомат состояний, скажем, вполне можно метками вместо типичного свитча в цикле написать. Собственно способ со свитчом даже несколько хуже и менее понятен из-за того что переходы осуществляются не явно, а через значения переменной состояния...

          Пока метки в одном методе и этот метод состоит из 30-50 строк, ничего плохого в метках нет...

          Даже наоборот, попытка избегнуть использования переходов в тех случаях когда они вполне естественны ведёт к достаточно аномальному хотя и структурированному коду...
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А зачем его использовать, кроме автогенерации какой-нибудь грамматики (вспоминая bizon :)) или выхода из вложенных циклов? Просто для себя стало интересно :)
        • 13 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
          IGNORE (Структура блога подвела)

          Да и вообще вся эта полемика goto и вопли насчёт его вреда или пользы - это всё ерунда. Хватит читать этот тред, лучше идти заняться делом. Всё равно ничего существенно нового не будет. ;-)
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Мне вообще лично пофиг, что писал глубокоуважаемый Дейкстра про использование goto. Я спросил Алекса о его мнении использования goto. Все признаки "дурного" тона и сравнение со стандартными методами, которые Вы описали мне неинтересны
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Письмо Дейкстры от 1968-го года о вреде переходов по меткам явно будоражит умы даже 40 лет спустя... ;-)

      Уж наверное разработчики Java тоже о "полемике goto" слышали и наверное "стопиццот" раз подумали когда реализовывали такой функционал. Вы не забывайте, что Дейкстра это писал ещё во времена широкого распространения, скажем, фортрана, где меток было много и они обозначались пятизначными числами. В java ситуация несколько иная, не так ли?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В письме было за goto? В яве нет goto... Разработчики даже зарезервировали этот идентификатор, чтобы никакой дурак не пытался сам реализовать. А break, continue, return - это не goto.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          да, а вот если реализовать gogo который точно тоже самое делает, но не зарезервирован, то эт все хорошо будет...
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          В письме было против goto. С него и начались бурные обсуждения что goto это плохо (а пока Дейкстра не написал, было хорошо).

          Зарезервировано не для того, чтоб никто не пытался реализовать. Это слишком странная идея была бы. Наоборот, чтобы никто не использовал в программе слово, которое в дальнейшем разработчики могут захотеть реализовать.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      break/continue внешнего цикла вещь очень удобно, и при чтении тоже всё понятней становится. Постоянно использую и в олимпиадном и в своем коде.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не хочу показаться язвительным, но судя по текущему "цвету" автора топика - проблема далеко не в знании языка...
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Насчёт цвета участников проезжаться - это не самый джентльменски-спортивно-этичный стиль. Тем более от синего до серого всего две достаточно условные ступеньки... ;-)

    Я сам на "спортивных" сайтах, начиная с топкодера, стал пробовать свои силы именно чтобы азы java освоить. Сейчас это уже утратило актуальность. Авось и у автора топика всё сложится нормально.
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Невнимательность погубила. Я понимаю, что автор видимо только начал осваивать Java, но перепутать присваивание со сравнением и при этом написать такой "не тривиальный" шаблон для чтения... это сильно.

      Да, Java дала ему написать такое коварное выражение в if, но неужели не "передернуло" ничего внутри за весь контест? Урок на всю жизнь, полагаю.

      Просто судя по коду автора складывается ощущение, что он изучал Java по кодам других участников после программирования на Паскале. Поэтому может Вам стоит сперва книжку по основам хорошо прочитать, а уже потом спрашивать про вещи, хорошее понимание которых нужно как раз в олимпиадном применении?

      • 13 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

        Э-э-э... Я-то тут причём... не хочу книжку... У меня эта задача несколько короче решена... ;-)

        А шаблоны для чтения... Меня больше всего поражает что почти все начинающие спортсмены считают что именно использование какого-нибудь мегаскребучего паттерна их спасёт... Больше всего забавляет пресловутое "implements Runnable"...

        А впрочем, если человек даже на аватарку себе Бреда Питта прицепил, то наивно ждать что его программы будут блистать неповторимостью, оригинальностью... ;-)))
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Кстати да пользуясь случаем не объясните в чем профит этого Runnable?

          Я яву знаю не очень и тупо в свой шаблон вставил. Гуглить (и что именно) было непонятно-лениво.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Если писать в main, а не run, то придется все глобальные переменные и методы объявлять статическими, что неудобно.
          • 13 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
            UPD: нашёл-таки ссылку где обсуждалось зачем зачем имплементировать Runnable (или Thread) и как потом использовать.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          А что вас смутило в шаблонах для чтения?
          Это удобно и быстро, в отличие от Scanner который я в вашем коде увидел. Вы ведь в курсе что он работает гораздо медленнее чем описанный в шаблоне вариант?
          • 13 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            Медленнее работает для чтения 2 строчек по 100 символов?

            UPD Не, вы что, правда считаете что можно было с такими ограничениями TLE из-за Scanner получить? ;-)

            BufferedReader я отнюдь не избегаю - по-моему даже однажды хотел его применить - в задаче про тетрис - правда до меня дошло что в этой задаче у меня тормозит не ввод а вывод (тем не менее она сдалась почему-то).
            • 13 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Т.е. если внезапно будете решать задачу с большим вводом сначала напишете Scanner, потом увидите что тормозит, и потом исправите?
              И даже если сразу поймете что будет тормозить - потратите лишних 3 минуты на написание ввода.

              Вам не кажется что проще всегда использовать шаблон, к которому привыкаешь?
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Я и не думал, что паттерн спасет меня, это просто удобно написанный шаблон.
          Кто вам дал право судить меня? Кончайте разводить здесь холивар.

          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А что, на это право нужно?

            Любой пишущий посты в собственный блог или комментирующий чужие, или даже просто участвующий в соревнованиях должен быть готов к тому что его могут и похвалить, и предать суровому порицанию... ;-)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Кто вам сказал, что у меня проблема? Хотелось услышать советы других. Читаю Философию Java и вижу, что не всё используется в СП.
    Насчет того, что слил контест, я только через час после начало контеста сел решать задачи, и то на 20 мин. Так что, не нужно так писать.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну дык мне тоже сесть удалось позже начала, а на 50-й минуте пришлось идти смотреть мультик с женой... ;-)

      Среди всех этих порицаний вы можете заметить ценный совет:
      Оставьте на время "удобные паттерны", особенно если не понимаете их... сосредоточьтесь на изучении API. Первая задача решалась в одну строчку с использованием String.compareToIgnoreCase... Это был отличнейший шанс дёрнуть всех пишущих на C++, кажется... ;-)

      Особенно на первых порах важно побольше писать ручками и поменьше копировать...
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это я уже просек. Спасибо конечно за совет. Насчет String.compareToIgnoreCase, респект. А вот по поводу "Ну дык мне тоже сесть удалось позже начала, а на 50-й минуте пришлось идти смотреть мультик с женой". И как вы умудрились получить такие баллы? Не хорошо обманывать!
        486
        00:07
          948
        00:13
        1120
        00:55
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Не обманываю! Упрощаю! ;-)

          Если быть точным, то мультик я пошёл смотреть когда три первых задачи сдал в первый раз - т.к. по двум последним задачам идей не было. А потом на ноуте выскочило сообщение что решение почелленджено и мультик был поставлен на паузу на какое-то время оторвался чтоб её добить... Принято?
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            :)
            Принимается.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Ну, лады, спасибо. ;-)

              Тогда будем надеяться что в четверг (или когда там след. контест) будет возможность более удачно выступить!