Задать вопрос
Ответы пользователя по тегу Java
  • Как реализовать метод буквенного номера по числу?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот мой действующий код на «Си с крестами». Индексы — ВНИМАНИЕ — начинаются с нуля. Сумеете перевести на Яву, и из второго оставить одни буквы? Первое действует для любой длины, второе — для длины до 3 символов, присущей Excel’ю.

    std::wstring xl::colNameW(
            size_t aIndex)
    {
        wchar_t q[21];  // more than enough even for 64-bit system :)
        wchar_t* ptr = q + 20;
        *ptr = 0;   // debug
    
        // Getting size
        size_t n = 1;
        unsigned long long pw = 26;
        while (aIndex>=pw && n<20)
        {
            aIndex -= static_cast<size_t>(pw);
            pw *= 26;
            ++n;
        }
    
        FOR_S(i, 0, n)  // макрос, означающий for (size_t i = 0; i < n; ++i)
        {
            *(--ptr) = static_cast<wchar_t>(L'A' + (aIndex % 26));
            aIndex /= 26;
        }
        return std::wstring(ptr, n);
    }
    
    namespace {
    
        bool isCap(const char* x, const char* aEnd)
        {
            return (x != aEnd && *x >= 'A' && *x <= 'Z');
        }
    
        bool isDig(const char* x, const char* aEnd)
        {
            return (x != aEnd && *x >= '0' && *x <= '9');
        }
    
    }   // anon namespace
    
    
    xl::CellCoords xl::parseCellCoords(
            const char* aStart, const char* aEnd)
    {
        enum {
            AA = 26,
            AAA = 26 + 26 * 26
        };
        xl::CellCoords r;
        // Letter
        r.col = 0;
        if (!isCap(aStart, aEnd))
            return CellCoords::bad();
        r.col = *(aStart++) - 'A';
        if (isCap(aStart, aEnd)) {
            r.col = (r.col * 26) + *(aStart++) - 'A';
            if (isCap(aStart, aEnd)) {
                r.col = AAA + (r.col * 26) + *(aStart++) - 'A';
            } else {
                r.col += AA;
            }
        }
        // Number
        r.row = 0;
        while (isDig(aStart, aEnd)) {
            size_t r0 = r.row;
            r.row = r.row * 10 + *(aStart++) - '0';
            if (r.row < r0)
                return CellCoords::bad();
        }
        if (r.row == 0 || aStart != aEnd)
            return CellCoords::bad();
        --r.row;
        return r;
    }


    Принцип действия перевода цифра → буква.
    Находим, сколько букв в нашей колонке. Допустим, три. Вычитаем из цифры номер колонки AAA (т.е. 26 + 26·26, если нумеровать с нуля, и 1 + 26 + 26·26 — если с единицы), и оставшееся переводим в 26-ичную систему счисления (A=0, B=1, C=2…).

    Принцип действия перевода буква → цифра аналогичен. Находим количество букв. Если их три, то переводим из 26-ичной системы счисления в цифру и прибавляем номер колонки AAA.
    Ответ написан
    Комментировать
  • Java или C++ в качестве первого языка. Что выбрать?

    @Mercury13
    Программист на «си с крестами» и не только
    Только Java. Почему…
    1. Достаточно удачная стандартная библиотека.
    2. Проверка массивов на индекс — для начинающего бесценно.
    3. Не настолько полагается на указатели, когда человек ещё толком не знает, что это такое.
    4. Очень строгая проверка типов.
    5. Статическая типизация, Си-подобный синтаксис (хотя всё это у обоих).
    6. Сообщения об ошибках не настолько страшны (стандартная библиотека Си++ полагается на шаблоны).
    Вторым языком человек уже съест что угодно, но Си без плюсов — один из худших первых. Си++ не так плох, но Java, по-видимому, лучше.
    Ответ написан
    4 комментария
  • Зачем прописывать методы в Interface когда можно так же в классе?

    @Mercury13
    Программист на «си с крестами» и не только
    Ответ явоспецифичный. Потому что один класс может реализовать сколько угодно интерфейсов, но наследуется лишь от одного класса.

    Ответ концептуальный. Ромбическое наследование. От А наследуются B и C, от них обоих наследуется D.
    1) Если в A есть поле, в D что, это поле будет в двух экземплярах? А если оно protected и в B мы добавили метод, который его меняет?
    2) Если B и C переопределяют какой-то метод foo(), как быть D? А если нужна и версия B.foo(), и C.foo(), и они обе вызывают A.foo — получатеся D.foo вызовет A.foo дважды? А если в C есть второй метод bar(), который вызывает foo() и начинает вести себя не так, как надо, если мы берём реализацию B.foo()?
    В общем, множественное наследование — хорошая штука, но ромбическое — штука опасная. В языке, где любое множественное наследование неизменно ромбическое, всё, что остаётся — делать такие условия, при которых ни 1, ни 2 не сработает.
    Одно из таких условий — унаследоваться от одного класса и нескольких интерфейсов. 1) У интерфейса нет полей, и 2) эталонная реализация, существующая в некоторых языках программирования, в любом случае менее приоритетна, чем конкретная реализация из класса. Вызывать ту и другую нет смысла: если программист написал свою сверх эталонной — значит, он хочет сделать то же другим путём.
    Ответ написан
    Комментировать
  • Как написать структура классов платформера?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Перед нами серьёзный проект: есть и сеть, и подкачка, и поиск путей. Если вы будете писать платформер с нуля, вероятно, «лишние» компоненты вы писать не будете.
    2. Это компоненты, а не классы. Структура классов в геймплее будет более густая, а в рендеринге и физике — менее.
    Например, пишем 2D-рендеринг. Я бы делал Renderer, Tileset, TileLayer, Sprite, Particle…

    В зависимости от желания и целей, лучше воспользуйтесь чужим движком или напишите свой простенький. Куча вопросов отпадёт.
    Ответ написан
    Комментировать
  • Как понять решение задачи по нахождению всех анаграмм (рекурсия)?

    @Mercury13
    Программист на «си с крестами» и не только
    По очереди для каждого из элементов.
    1. Поставить его на последнее место.
    2. Вызвать функцию рекурсивно с длиной на 1 меньшей.

    Она, соответственно, будет по очереди ставить на ПРЕДпоследнее место каждый из оставшихся, и т.д.
    Ответ написан
  • Как открыть порт на роутере? Комплексное решение?

    @Mercury13
    Программист на «си с крестами» и не только
    1. https://portforward.com/tp-link/tl-wr740n/
    www.pcwintech.com/port-forwarding-tp-link-tl-wr740...
    forum.tp-linkru.ru/viewtopic.php?t=9
    Но не забывайте, что это требует статического IP-адреса сервера, и лучше всего это сделать, прописав статическую зависимость MAC-IP. По третьей сцылке это есть.
    2. Гуглите UPnP. Посмотрите, допустим, вот. Использование UPnP C++
    3. Сам даже не знаю. Как-то само из кусочков понимание собралось. Правда, я в своё время налаживал локальные «сети» по COM- и LPT-кабелю. А потом по-чёрному резался в разные игры по интернету. Разумеется, тонкостей настройки больших сетей мне это не дало, но как ходят пакеты, примерно понимаю.
    Ответ написан
    2 комментария
  • Почему при попытке запустить оконное приложение через cmd с помощью java ничего не происходит?

    @Mercury13
    Программист на «си с крестами» и не только
    Извините, где точка входа? Где main(String[])? Где запуск оконного цикла AWT?

    Ну и оконные программы надо пускать программой java, если хотите видеть консоль, и javaw — если не хотите.
    Ответ написан
    3 комментария
  • Как вывести самую большую цифру из номера в java?

    @Mercury13
    Программист на «си с крестами» и не только
    Разобрать по цифрам и сделать.
    Положительное число разбирают по цифрам так.
    while (n != 0) {
      digit = n % 10;  // делай с этой цифрой что хочешь
      n /= 10;
    }

    Куда пустить цифры и как сделать поправки на нули и отрицательные — думай сам.
    Ответ написан
    Комментировать
  • Как запустить на выполнение exсel файл из java?

    @Mercury13
    Программист на «си с крестами» и не только
    docs.oracle.com/javase/6/docs/api/java/awt/Desktop.html

    Как работает, не проверял.
    Ответ написан
    Комментировать
  • Как найти минимальное время которое удовлетворяет условие?

    @Mercury13
    Программист на «си с крестами» и не только
    Если для боя с боссом нужно 0 очков — выводим 0.
    Если все миссии в сумме дают <K очков — выводим «Нельзя».
    А если нет — ничего пока не вижу, кроме продвинутого перебора.

    Сортируем миссии по соотношению «очки/время». Главное — правильно отсечь перебор: например, каждый раз линейно экстраполируем по соотношению «очки/время» лучшей доступной миссии: удастся вписаться или нет? Смотрим на сумму «хвоста»: можно ли вообще, просуммировав «хвост», получить K?
    int N, K;
    Mission missions[100];
    int bestTime = std::numeric_limits<int>::max();
    
    bool recurse(int firstMission, int currPoints, int currTime)
    {
        if (currTime >= bestTime)
            return false;
        if (currPoints >= K) {
            bestTime = currTime;
            return false;
        }
        if (firstMission >= N)
            return true;
    
        int remPoints = K - currPoints;
    
        for (int i = firstMission; i <= N; ++i) {
            bool isFirst = (i == firstMission);
            const Mission& im = missions[i];
            if (currPoints + im.tailPoints < K)           // tailPoints = сумма очков по хвосту от missions[i] до конца
                return isFirst;
            float wantedTime = currTime + remPoints * im.ratio;    // ratio = (float)m.time / m.points;
            if (wantedTime >= bestTime)
                return isFirst;
            if (recurse(i + 1, currPoints + im.points, currTime + im.time))
                return isFirst;
        }
        return false;
    }

    Миссии, как и раньше, отсортированы по ratio по возрастанию.

    И последняя моя идея, в разы ускорившая перебор, такова. Рекурсивная функция возвращает true, если весь разрешённый «хвост» безнадёжен и в нём искать больше нечего. Это происходит при таких условиях.
    1. Хвост пуст.
    2. Хвоста недостаточно, чтобы получить K очков.
    3. Простейшая экстраполяция по 1-й миссии провалилась.
    4. Уже первый рекурсивный вызов говорит: хвост безнадёжен.

    UPD2. Ну и вторая идея, которая там есть. Если хвост безнадёжен, то меньшие хвосты безнадёжны и подавно.
    Ответ написан
  • Как освободить память в java?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Самое простое. var = null; Если нужно ещё и мусорщика пустить — ну пусти, System.gc();
    2. Если нужно, чтобы объект не удерживался — WeakReference. Как только объект исчезнет, слабая ссылка перещёлкивается в null. Бывает нужно: 1) если объекты-дети переживают своих владельцев, и при этом потерять владельца — это несмертельно; 2) когда строим какой-нибудь временный список.
    3. Не выдавать безымянный объект наружу, если он переживает создателя. В безымянных объектах есть ссылка на создателя. Выдавать лямбду: если создатель не нужен, ссылки никакой не будет.
    4. Аналогично с внутренними классами — если он переживает создателя, делай его static.
    5. String.intern, если вы работаете с кучей мелких одинаковых строк. Ну или наладить свой кэш :)
    6. Использовать объектные пулы и прочие структуры, снижающие нагрузку на мусорщик.
    7. Разбивая строки на мелкие кусочки, использовать паттерн doSomething(String data, int start, int length), не вытягивая подстроку физически. Использовать StringBuilder.
    Ответ написан
    1 комментарий
  • Как сделать скриншот определенной программы на java?

    @Mercury13
    Программист на «си с крестами» и не только
    colororacle.org
    Вот тут опенсорсный симулятор дальтонизма на Java. Делает снимки всего экрана; как — посмотрите в исходники.

    Сомнительно, что получится на Java кроссплатформенно сделать снимок отдельной программы — больно уж системная штука.

    P.S. Для скриншотов используется класс, именуемый «тестирующий робот» — скриншот-то им можно сделать, а вот как получить прямоугольник чужого окна? По-видимому, только через native-обёртку.

    P.P.S. Оказывается, и native-обёртка есть — JNA. С ней никогда не работал.
    Ответ написан
    Комментировать
  • Для чего используются "методы по умолчанию" на практике?

    @Mercury13
    Программист на «си с крестами» и не только
    Это приближает интерфейсы Java к примесям.

    1. Очень часто бывает, что у какой-то функции есть реализация, опирающаяся на другие функции — либо базовая неоптимальная, либо вообще единственно возможная. Чаще всего это избыточные функции-утилиты. Пишу на Си++
    class Stream {
    public:
      virtual void write(size_t length, const void* data) = 0;
    
      // пишет в поток word в машинном порядке байтов
      void writeW(uint16_t data) {
        write(2, &data);
      }
    };

    За что вообще так ненавидят множественное наследование? За дублирование данных! Вот у нас некая штука, без единого поля данных — почему в Java она класс, а не интерфейс?

    2. Какую-то функцию переопределяют настолько редко, что лучше сделать ей реализацию на месте. Опять Си++.
    class ErpConnector {
    public:
      // 80% модулей не могут экспортировать данные в систему управления
      //   предприятием — напишем базовую реализацию.
      virtual bool canExportData() const { return false; }
      virtual void exportData() const {}
    };


    3. И просто документирование, как оно должно себя вести :) Из реального проекта, снова Си++.
    void im::DateGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
    {
        aDate = toDate(toInt(aDate, aStart), aStart);
    }

    Класс служит для группировки дат в периоды (недели, месяцы, годы). aStart — это дополнительный int, позволяющий начать год с февраля или месяц с 15-го. Эта функция переводит дату «на месте» в первую дату периода. Она крайне неоптимальна (дату в число, затем число опять в дату) и потому переписана почти во всех в реализациях.
    void im::MonthGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
    {
        if (aDate.day < aStart)
            aDate.addMonthsMechanical(-1);  // механически вычесть 1 месяц; дата может стать неверной.
        aDate.day = aStart;
        aDate.fixupTo1();    // неверную дату привести к 1-му числу следующего месяца
    }


    Но по крайней мере понятно, как она должна работать.
    Ответ написан
    Комментировать
  • Существует ли реализация J2ME для Java SE\С++?

    @Mercury13
    Программист на «си с крестами» и не только
    CLDC и MIDP — это всего лишь стандартные библиотеки Java ME. Первое — это штатные возможности процессора и JVM, более ограниченные, чем Java SE. Второе — доступ к аппаратуре телефона: LCDUI, MMAPI и прочее. Ещё одно отличие — т.н. преверификация классов (Java SE вычисляет информацию о классах сама, а Java ME с кастрированным загрузчиком — полагается на расчёт на настольном компьютере).

    Как они архитектурно реализованы, какой процент библиотек написан на Java и какой в машинном коде — программиста на Java ME совершенно не интересует (кроме случаев, когда на мобильнике какой-то класс глючит). На то он и ME, что даёт простой фреймворк для написания софта для мобильников.

    Какой-то эмулятор есть в Java ME SDK. Как его настроить под нужный мобильник, я не в курсе.
    Также есть MicroEmulator: https://code.google.com/archive/p/microemu/downloads . Если вы хотите быть такой элитой Java ME, что будете писать свои драйверы (или просто встроить поддержку ME куда-то в другую программу), думаю, что MicroEmulator — неплохой тестовый полигон. Обычный ME’шник драйверов не пишет, их пишут авторы прошивок мобильников.
    Ответ написан
  • В чем суть self-bounded types?

    @Mercury13
    Программист на «си с крестами» и не только
    Не в этом дело. Тут задача — уже при компиляции сказать, что программа некорректна и нельзя сравнивать, например, enum TrLight { RED, YELLOW, GREEN } и enum Pet { CAT, DOG, HEN }.

    Для Java-машины TrLight и Pet — один и тот же класс, проверка шаблонных классов идёт при компиляции!
    Ответ написан
    Комментировать
  • Как действует предупреждение «Suspicious names combination» в NetBeans?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Suspicious names combination прост и туп: x с width, y с height. Даже если в одном месте x или width, а рядом ни того, ни другого — уже предупреждение. Причём x и y находит в довольно-таки экзотических местах. И energy ему не понравился именно буквой y.
    Ответ написан
    Комментировать
  • Как назвать фракции в настольной игре (именование классов)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Я в конце концов назвал их…

    FactionRule
    FactionChoice
    Faction
    Player
    Мультиплеер пока бросил.
    Ответ написан
    Комментировать
  • Какой шрифт я получаю при использовании метода Font.getFont() в Java2ME?

    @Mercury13
    Программист на «си с крестами» и не только
    Как бывший ME’шник и видевший своими глазами кучу мобилок, скажу…
    Стандарта никакого нет. Nokia имела три шрифта со всеми начертаниями. Motorola — только один, без всяких начертаний. TTF, как правило, нет, шрифты обычно точечные. TTF — если он там TTF — можно, конечно, извлечь из прошивки телефона, но не программно на ME.
    N71, E51… Вспоминаю телефоны, было дело…
    Если нужен был широкий порт и единообразный вид на разных мобильниках, обычно писали собственный типографский движок.
    Ответ написан
    1 комментарий
  • Как правильно обратно вернуть значения в байты с помощью побитовых операций?

    @Mercury13
    Программист на «си с крестами» и не только
    byte[] streamedResponse = new byte[100];
    for (int iWord = 0, iByte = 4;
            iWord < 50;
            ++iWord, iByte += 2) {
        int w = MassCurrentsPhases[iWord];
        streamedResponse[iByte] = (byte)w;
        streamedResponse[iByte + 1] = (byte)(w >> 8);
    }

    Что представляет собой четырёхбайтовый заголовок, который вы пропустили, я не знаю.
    Ответ написан