• Как эффективно разбить множество строковых значений на непересекающиеся группы?

    @MaxLich
    java developer
    Нашёл одно решение. Алгоритм:
    1. храним результат в виде списка списков: [номер_группы -> [строки_группы]]
    2. используем вспомогательный список хэш-таблиц: [позиция_слова -> { слово -> номер_группы }] и вспомогательную хэш-таблицу для хранения какая группа в какую была влита
    3. каждое слово строки ищем в соответствующей (позиции слова в строке) хэш-таблице
      а) если слово есть, запоминаем номер группы (значение из хэш-таблицы), в которой оно найдено
      б) если слова нет, то добавляем его в список новых слов
    4. если строка (а точнее её слова) найдена в группах, то берём первую из "живых" (объяснение этого позже) групп, иначе создаём новую группу
    5. добавляем новые слова в соответствующие хэш-таблицы с номером найденной/созданной группы
    6. объединяем найденные группы в одну, выбранную ранее. Так как группы хранятся в виде списка строк, то просто объединяем списки строк в один у выбранной группы, а более ненужные группы отмечаем как "мёртвые" (присваиваем null, дабы не перемещать элементы внутри списка)
    7. добавляем строку в список строк группы


    Код метода поиска групп:
    code
    private static List<List<String>> findLineGroups(List<String> lines) {
            class NewLineElement {
                private String lineElement;
                private int columnNum;
    
                private NewLineElement(String lineElement, int columnNum) {
                    this.lineElement = lineElement;
                    this.columnNum = columnNum;
                }
            }
    
            if (lines == null)
                return Collections.emptyList();
    
            List<List<String>> linesGroups = new ArrayList<>(); //список групп, каждый элемент вида "номер группы - список строк группы"
            if (lines.size() < 2) {
                linesGroups.add(lines);
                return linesGroups;
            }
    
            List<Map<String, Integer>> columns = new ArrayList<>(); // список стобцов, каждый столбец - мапа с парами "элемент строки/столбца-номер группы"
            Map<Integer, Integer> unitedGroups = new HashMap<>(); //мэп с парами "номер некоторой группы - номер группы, с которой надо объединить данную"
            for (String line : lines) {
                String[] lineElements = line.split(";");
                TreeSet<Integer> groupsWithSameElems = new TreeSet<>(); //список групп, имеющих совпадающие элементы
                List<NewLineElement> newElements = new ArrayList<>(); //список элементов, которых нет в мапах столбцов
    
                for (int elmIndex = 0; elmIndex < lineElements.length; elmIndex++) {
                    String currLnElem = lineElements[elmIndex];
                    if (columns.size() == elmIndex)
                        columns.add(new HashMap<>());
                    if ("".equals(currLnElem.replaceAll("\"","").trim()))
                        continue;
    
                    Map<String, Integer> currCol = columns.get(elmIndex);
                    Integer elemGrNum = currCol.get(currLnElem);
                    if (elemGrNum != null) {
                        while (unitedGroups.containsKey(elemGrNum)) // если группа с таким номером объединена с другой,
                            elemGrNum = unitedGroups.get(elemGrNum); //то сохраняем номер группы, с которой была объединена данная
                        groupsWithSameElems.add(elemGrNum);
                    } else {
                        newElements.add(new NewLineElement(currLnElem, elmIndex));
                    }
                }
                int groupNumber;
                if (groupsWithSameElems.isEmpty()) {
                    linesGroups.add(new ArrayList<>());
                    groupNumber = linesGroups.size() - 1;
                } else {
                    groupNumber = groupsWithSameElems.first();
                }
                for (NewLineElement newLineElement : newElements) {
                    columns.get(newLineElement.columnNum).put(newLineElement.lineElement, groupNumber);
                }
                for (int matchedGrNum : groupsWithSameElems) { //перебираем все группы с таким же элементом
                    if (matchedGrNum != groupNumber) {
                        unitedGroups.put(matchedGrNum, groupNumber); //сохраняем инф-цию об объединённых группах
                        linesGroups.get(groupNumber).addAll(linesGroups.get(matchedGrNum)); //объединяем группы
                        linesGroups.set(matchedGrNum, null); //помечаем группу с текущим номер, как несуществующую
                    }
                }
                linesGroups.get(groupNumber).add(line);
            }
            linesGroups.removeAll(Collections.singleton(null)); //удаляем несуществующие группы
            return linesGroups;
        }
    Ответ написан
    1 комментарий
  • Чем отличается сбертех от сбербанк для экспертов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Современные банки - это технологические компании, но всё равно этот род деятельности для них не профильный, к тому же банковская деятельность накладывает множество ограничений на сотрудников, что инновациям и быстрому циклу разработки не способствует. Поэтому Сбер под каждый перспективный проект или направление заводит дочернюю компанию. В частности Сбертех - одна из таких дочек. А "Сбербанк для экспертов", если не ошибаюсь - это такое надобразование, включающее в себя все эти дочки, и выступающее как единый наниматель.
    Ответ написан
    3 комментария
  • Как отправить запрос на сервер при закрытии вкладки?

    IvanSCM
    @IvanSCM
    Заведите константу а-ля какое время считать пользователя активным, например минута.
    При каждом запросе записывайте время этого запроса (действия пользователя).
    Далее простая функция пусть вычисляет онлайн пользователь или нет(прошла минута с последнего запроса этого пользователя или нет).

    Данное решение используется во многих движках сайтов и форумов.
    Ответ написан
    1 комментарий
  • Создал личный сервер в майнкрафт. после закрытия программы Putty, сервер закрывается (я полный ноль, все делал по гайдам), что делать?

    @snegear
    Можно использовать nohup для того, чтобы при разрыве ssh-соединения процесс, запущенный в сеансе вашего пользователя, продолжал работать.
    Ответ написан
    Комментировать
  • Почему Windows 11 при подключении к контроллеру домена начинает сильно зависать, загружая процессор и диск на 100%?

    borisdenis
    @borisdenis
    Ленив и вреден...
    Возможно политиками указано, что необходима разовая полная проверка антивирусом, вот он и грузит. Может обновления устанавливает. Нужно знать что за процесс загружает систему.
    Ответ написан
    Комментировать
  • Как сделать чтобы .bat или .cmd файл запускался от имени администратора?

    pindschik
    @pindschik
    ФЫВА ОЛДЖ
    Суньте в начало батника, он будет запрашивать повышение привилегий сам:

    @echo off
    setlocal enableextensions
    pushd "%~dp0"
    set PATH=%cd%;%PATH%
    if defined PROCESSOR_ARCHITEW6432 start "" %SystemRoot%\sysnative\cmd.exe /c "%~nx0" %* & goto :EOF
    net session >nul 2>&1 || (
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\GetAdmin.vbs"
    echo UAC.ShellExecute "%~nx0", "%*", "", "runas", 1 >> "%temp%\GetAdmin.vbs"
    cscript //NOLOGO "%temp%\GetAdmin.vbs"
    del /f /q "%temp%\GetAdmin.vbs" >nul 2>&1
    exit
    )
    Ответ написан
    2 комментария
  • Под какие разрешения экранов делать игру?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Я не представляю как на смартфоне смотреть что-то в разрешении 1280x2400. Это смартфон с мой монитор?

    Есть такое понятие как DPI - число точек на дюйм. Плотность точек на дюйм в смартфоне на порядок выше, чем в твоём мониторе. И на два порядка выше, чем в любом HD/4K-телевизоре
    Ответ написан
    4 комментария
  • Как узнать, на каком движке работает сайт?

    Может есть какие-то бесплатные сервисы распознания движка?


    есть https://2ip.ru/cms/
    работает хорошо, давно пользуюсь

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


    вполне возможно это просто голый html, без движка вообще
    Ответ написан
    5 комментариев
  • Как подключить оплату к сайту, если сайт сделан без cms?

    vabka
    @vabka Куратор тега Веб-разработка
    У сервиса оплаты, кроме гайдов, таки должна быть документация на api, через который его придётся интегрировать с сайтом.
    Если она отсутствует - стоит посмотреть ещё раз внимательно, а потом, если реально нет, спросить в поддержке.
    Ответ написан
    Комментировать
  • Можно ли пингануть сайт с учетом протокола и могут ли версии с HTTP и HTTPS жить на разных серверах?

    @vvag
    1) легко на разных серверах. Обратный прокси и делай с ним что хошь :) Хоть хттп на одном сервер,хоть хттпс на другом, хоть рест апи до сервиса на третьем компе. Хоть хренову тучу хттпс....
    Ответ написан
    Комментировать
  • Какие существуют ресурсы, схожие по удобности для новичка, как webref.ru?

    @tusklozeleniy
    Front-end разработчик
    learn.javascript.ru - пожалуй лучший учебник по JS. Все очень просто и понятно написано.
    https://www.codecademy.com/ - если знаешь английски (начальный уровень пойдет), то тоже стоит открыть. По всем интересующим технологиям есть курсы. Куча задачек нацеленных на понимание, обучение постепенное от простого к сложному.
    Ответ написан
    Комментировать