1. Java / Говнокод #27313

    +5

    1. 1
    2. 2
    3. 3
    private static String getMargin(final int size) {
            return "                                                                                                                             ".substring(0, 6 * size);
        }

    Как создать пустую строку с заданной длиной...

    Запостил: nekkiy, 24 Марта 2021

    Комментарии (31) RSS

    • О, генератор IndexOutOfBoundsException.
      Ответить
    • в платной версии поддерживаются более длинные строки
      Ответить
    • это же оптимизация, циклы не тратятся - препроцессенная строка уже готова к использованию
      Ответить
      • ну да, там будет указатель на адрес и смещение в строковом литерале же
        Ответить
    • Отвратительно няэффективно.

      #include <array>
      #include <string_view>
      #include <iostream>
      
      template<size_t Size, auto MarginChar = ' '>
      struct Margin {
          using CharT = decltype(MarginChar);
          using MarginType = std::basic_string_view<CharT>;
      
          static constexpr MarginType getMargin() noexcept
          {
              return MarginType(_data.data(), _data.size());
          }
      
      private:
          template<typename T, T... Args>
          constexpr static auto _get_data_impl(std::integer_sequence<T, Args...>)
          {
              return std::array<CharT, Size>{(static_cast<void>(Args), MarginChar)...};
          }
      
          constexpr static auto _get_data() noexcept
          {
              return _get_data_impl(std::make_integer_sequence<size_t, Size>());
          }
      
          constexpr static inline auto _data = _get_data();
      };
      
      
      int main()
      {
          constexpr std::string_view margin10 = Margin<10, 'x'>::getMargin();
          std::cout << "Margin10 == " << margin10 << std::endl;
      }
      Ответить
      • Строковые литералы не шарятся при таком подходе, или я не понял рахитектуры?
        Ответить
        • Не шарятся, у каждой специализации Margin<> свой собственный "литерал" (статический массив чаров).
          Ответить
          • Не эквивалентно ОП-коду тогда. В ЙАЖА substring берёт слайс оригинальной строки вроде.
            Ответить
            • В Java Stringи иммутабельны, поэтому семантически это эквивалентно оригинальному коду (ну, кроме того, что Size надо умножить на 6).
              Ответить
              • В яже нет коровы для строк?
                Ответить
                • Коровы?
                  Ответить
                  • COW.
                    Ответить
                    • Нет, насколько я знаю, просто иммутабельные строки. Уровень документации у Java отвратителен, конечно: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
                      The String class represents character strings. All string literals in Java programs,
                      such as "abc", are implemented as instances of this class. Strings are constant;
                      their values cannot be changed after they are created. String buffers support
                      mutable strings.


                      Про substring() пишут ещё меньше:
                      Returns a string that is a substring of this string. The substring begins at
                      the specified beginIndex and extends to the character at index endIndex - 1.
                      Thus the length of the substring is endIndex-beginIndex.


                      На SO говорят (https://stackoverflow.com/questions/4679746/time-complexity-of-javas-substring), что "As of update 6 within Java 7's lifetime, the behaviour of substring changed to create a copy - so every String refers to a char[] which is not shared with any other object, as far as I'm aware. So at that point, substring() became an O(n) operation where n is the numbers in the substring".
                      Ответить
                      • > уровень документации у java отвратителен

                        Это ты ещё питоньи доки не читала...
                        Ответить
                      • сестренка, я тебе покушать принес
                        https://dzone.com/articles/changes-stringsubstring-java-7
                        Ответить
                        • Почему это всё надо искать на каких-то левых сайтах а не в документации на язык/jvm?
                          Ответить
                          • Потому что ты не должен знать как устроен сабстринг. Ты же всего лишь программист, а не создатель стандартной библиотеки языка. Зачем тебе низкоуровневые подробности, в которых ты всё равно ничего не поймешь?

                            Иди лучше веб-магазин на спринге пили
                            Ответить
                            • а кстати да, есть какой юзайкейс где очень важно что пiдстроки стали reference counted учитывая их иммудабельность?
                              Ответить
                  • Хорошая попытка закосить под ньюфага, не знающего местной терминологии...
                    Ответить
                    • Я тоже не знаю что такое корова для строк.
                      Ответить
                      • ууууу коровы нет других забот,
                        ест траву и молоко дает!
                        для кого старается, она?
                        для меня, для меня, для меня!
                        Ответить
                      • https://gitlab.com/uploads/-/system/project/avatar/11903530/kali-cowpatty.png
                        Ответить
        • Интересно, можно ли насфиначить такой шаблон, чтобы в пределах TU сгенерированные литералы были слайсами одного статического массива, длина которого выводилась бы автоматически. Ну, чтобы margin'ы разной длины не жрали память. Мой power level недостаточен T__T
          Ответить
          • Возможно через friend injection получится запилить глобалку с максимумом, а в конце файла объявить буфер.

            Но мой power level для этого тоже недостаточен.
            Ответить
          • > Интересно, можно ли насфиначить такой шаблон, чтобы в пределах TU сгенерированные литералы были слайсами одного статического массива, длина которого выводилась бы автоматически.

            Вам в тред про сортировку с суперпермутацией. https://govnokod.ru/24496

            Можно все иммутабельные строки попробовать сшить в одну иммутабельную зожатую мегастроку, и потом на нее тыкаться указателями с размером подстроки.
            Ответить
          • И в пределах одной TU это как-то анскильно, надо чтоб глобально на всю программу строк насобирать и зожать в одну
            Ответить
          • Можно: https://govnokod.ru/27316.
            Ответить
            • Не вижу там алгоритма нахождения самой короткой суперстроки, в которой есть все нужные подстроки.
              Ответить
      • Этот код не даёт мне нормально писать программы! Название эксепшена, который вылетает если обратиться не по тому индексу сложно запомнить, поэтому я всегда пользовался getMargin(9000), чтобы его вызвать. Как мне теперь быть, зачем было ломать то, что хорошо работало и упрощало жизнь?
        Ответить

    Добавить комментарий