Помогите onTabComplete. Выбор наиболее схожего с аргументом.

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Привет всем :)

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

Старые игроки могут помнить, что в версии 1.3 добавили функцию чата в игру, а вместе с ней и помощь в вводе команд используя TAB. Так вот, "Выбор наиболее схожего с аргументом" обозначает, что мне нужно ввести команду, а потом после этой команды подбирать наиболее схожую с 1ым аргументом подсказку(точного названия я не знаю, так-что условное - подсказка).

По факту, можно делать проверку сразу 2 буквы агрументы на схожесть с 2ой буквы аргумента из подсказки, но могут быть схожие слова, а тем-более можно ввести 3ью букву, которая не будет схожа с 3ей буквой подсказки, но при нажатие на TAB все равно выведет подсказку, изменив 3ью букву. А если продолжить тему с схожими словами, то я говорю про что-то на подобие help, helpop.

У кого есть идеи, как проверять на схожесть этого аргумента целиком - пишите.
 
если я тебя правильно понял, то это простейшая задачка на строки.

ща слабаю (я не работал с этим ивентом, поэтому к нему прикрутишь сам)
Вот что у меня получилось:
Java:
/**
    *
    * @param secarg - Слово, кооторое подлежит исправлению (напр: hetp)
    * @param firstarg - Слово на которое надо исправить (напр: help)
    * @param count - Кол-во букв которые должны совпасть в дух словах выше
    * @param correctors - список слов которые будут добавлены к исправленному варианту.
    * @param correctorcount - Кол-во букв которые должны совпасть в secarg и слове из correctors (начало secarg, которое совпадает с firstarg отсекается. т.е. если firstarg = help, secarg = hetp, то на проверку уйдет лишь "tp")
    * @return
    */
    public List<String> getSituableCorrections(String secarg, String firstarg, int count, String[] correctors, int correctorcount){
        if (counter(secarg, firstarg)>=count){
            return getSituableCorrectors(secarg, correctors, firstarg,correctorcount);
        }else return new ArrayList<>();
    }
 
    private List<String> wordToList(String word){
        List<String> LS = new ArrayList<>();
        for (int c = 0; c<word.length(); c++){
            LS.add(String.valueOf(word.charAt(c)));
        }
        return LS;
    }
 
    private int counter (String word, String checker){
        List<String> ls = wordToList(checker.toLowerCase());
        int k = 0;
        for (int c = 0; c<word.length(); c++){
         
            String sumbol = String.valueOf(word.charAt(c)).toLowerCase();
         
            if (ls.contains(sumbol)){
                ls.remove(sumbol);
                k++;
            }
        } 
        return k;
    }
 
    private List<String> getSituableCorrectors(String word, String[] correctors, String checker,int correctorcount){
        if (word.length()<checker.length())    checker = checker.substring(0, word.length()-1);
        for (int c = 1; c<checker.length(); c++){
            if (!word.startsWith(checker.substring(0, c))){
                word = word.substring(c-1);
            }
        }     
        List<String> tor = new ArrayList<>();
        for (String corrector:correctors){
            int k = counter(word, corrector) ;
            if (k>=correctorcount){
                tor.add(corrector);
            }
        }
        return tor;
    }
Загнал я это в java Application вот под таким соусом:
Java:
String[] correctors = new String[]{"op", "rename", "proxy", "star"};
        String firstarg = "help";
        String[] secargs = new String[]{"hlr", "hepr", "hrn", "herop", "hern",};
        for (String secarg:secargs){
            List<String> list = new ArrayList<>(getSituableCorrections(secarg, firstarg, 2, correctors, 1));
            if (list.isEmpty()) {
                System.out.println("Для аргумента "+secarg+ " ничего не надено!");
                continue;
            }

            System.out.print("Аргумент "+secarg+ " может быть исправлен на: ");
            for (String s : list){
                System.out.print(firstarg+s + " ");
            }
            System.out.println("");
        }

В консоль получил это:
upload_2017-1-28_11-30-9.png

Я думаю ты разберёшься что и куда вкручивать.
 
Писец ты костылщик, есть же стартвич.
по подробнее. куда ты тут собрался его пихать?
Писец ты костылщик, есть же стартвич.
if(str.startsWith(prefix)) {}
там где надо оно было использовано. подсчет по буквам используется что бы выриант hlpop выдал helpop.
 
Таб комплит работает по startsWith, нафиг там исправления. Если чел сомневается, то введет 1-2 буквы и дополнит.
я не работал с этим ивентом


нафиг там исправления.
для счастья (и снятия опечаток)
 
Посему тайм-лимит ввести надобно. Или даже кик при абузе. Но мы же ленивые жопы, потому проще тупо чатконтрол поставить и забыть об этих табах. =)))
 
Ну он же при нажатие таба будет гонять словари. Придет кто то умный и начнет срать таб пакетом.
защиту от "умных" меня не просили. человек думаю не дурак, сам сделает
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх