Как найти слова, которые содержат/состоят только из заданной последовательности символов

Я хочу просмотреть файл словаря и найти слова, содержащие только заданные символы

Пример дго

Желаемые результаты: собака, бог

НЕ слова, которые содержат (внутри них) данные символы

Я работаю со следующим кодом:

            while((dictionaryWord = br_.readLine()) != null) 
            {   

                    if(dictionaryWord.contains(getWord()))
                        System.out.println(dictionaryWord);

            }

Но это дает мне все слова, которые содержат данные символы - НЕ ЖЕЛАЕМЫЕ


person stackoverflow    schedule 12.05.2012    source источник
comment
Вы можете ознакомиться с этим руководством. Регулярные выражения — это то, что будет всплывать снова и снова, и, вероятно, неплохо с ними познакомиться.   -  person Jeffrey    schedule 13.05.2012
comment
@Джеффри, да, я с ними знаком. Я хотел сделать все это на Java, хотя   -  person stackoverflow    schedule 13.05.2012
comment
Я не уверен, подходит ли он, но я добавил тег анаграммы.   -  person James P.    schedule 13.05.2012


Ответы (2)


Без регулярных выражений:

public static boolean sameCharacters(String left, String right) {
    return sortCharacters(left).equals(sortCharacters(right));
}

private static String sortCharacters(String s) {
    final char[] chars = s.toCharArray();
    Arrays.sort(chars);
    return String.valueOf(chars);
}

ОБНОВЛЕНИЕ: улучшенная версия (спасибо user384706):

public static boolean sameCharacters(String left, String right) {
    return Arrays.equals(sortCharacters(left), sortCharacters(right));
}

private static char[] sortCharacters(String s) {
    final char[] chars = s.toCharArray();
    Arrays.sort(chars);
    return chars;
}
person Tomasz Nurkiewicz    schedule 12.05.2012
comment
Не лучше ли было бы: char[] sortCharacters(String s) и сравнить char [] вместо создания нового String и выполнения equal? - person Cratylus; 13.05.2012
comment
@JamesPoulson: String.valueOf(chars) делает ненужную внутреннюю копию массива chars, чтобы убедиться, что String остается неизменным. - person Tomasz Nurkiewicz; 13.05.2012
comment
Можно ли еще больше повысить производительность, избегая сортировки? Я думаю, что должно быть возможно написать метод для сравнения символов с использованием HashTable. Это будет иметь сложность O (N) по сравнению со средней сложностью случая O (NlogN) с сортировкой. - person Martin Prakash; 13.05.2012
comment
@MartinPrakash: теоретически: да. Однако для коротких строк (например, отдельных слов) стоимость HashSet может быть слишком большой. Не стесняйтесь публиковать свое решение и делать некоторые тесты, это может быть интересно. - person Tomasz Nurkiewicz; 13.05.2012

Вы можете проверить, выполнив

if (word.matches("[dgo]*")) {
    ...
}
person aioobe    schedule 12.05.2012
comment
хороший подход. на мой взгляд, я изменю * на +, чтобы избежать пустой строки. - person Tiago Peczenyj; 13.05.2012
comment
не будет ли он не совпадать с ддд, ггг что не то что требуется найти - person Subs; 13.05.2012
comment
@TiagoPeczenyj, мне кажется, это нарушение спецификации, поскольку пустая строка не содержит запрещенных символов. - person aioobe; 13.05.2012