0

私はこのコードで作業しています

                   while((dictionaryWord = br_.readLine()) != null) 
            {
                if(dictionaryWord.matches("^"+word.replace("*" , "." )+"$"))
                {   
                    incrementCounter();
                    System.out.println(dictionaryWord);
                }
            }

望ましい目標:word = dgo

出力:犬、神、ドグマメガログドンなど...

4

4 に答える 4

1

Set<Character>のすべての文字のを作成しword、それを繰り返すことができます。1つの文字がに​​ない場合dictionaryWorddictionaryWordは適合しません。すべてが表示された場合のみ-印刷dictionaryWord

    String word = "dog";
    String  dictionaryWord;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while((dictionaryWord = br.readLine()) != null)  {
        Set<Character> chars = new HashSet<Character>();
        for (char c : word.toCharArray()) {
            chars.add(c);
        }
        boolean match = true;
        for (Character c : chars) {
            String s = "" + c;
            if (!dictionaryWord.contains(s)) {
                match = false;
                break;
            }
        }
        if (match == true) 
            System.out.println(dictionaryWord);
    }

while上記のコードでは、もちろん、セットの作成をループの外に移動できます。

より効率的な解決策は、SetfromdictionaryWordも作成し、2つのセットの共通部分がを表すセットと同一であるかどうかを確認することですword
これは次のようになります:

    String word = "dog";
    Set<Character> set1 = new HashSet();
    for (char c : word.toCharArray()) {
        set1.add(c);
    }
    String  dictionaryWord;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while((dictionaryWord = br.readLine()) != null)  {
        Set<Character> set2 = new HashSet();
        for (char c : dictionaryWord.toCharArray()) {
            set2.add(c);
        }           Set<String> intersection = new HashSet(CollectionUtils.intersection(set1, set2));
        if (set1.equals(intersection)) {
            System.out.println(dictionaryWord);
        } else System.out.println("bad");
    }

CollectionUtils.intersection()ApacheCommonsから使用する

于 2012-05-12T22:09:16.663 に答える
1
public static void main(String[] args) {
  final BitSet reqChars = new BitSet(26);
  for (char c : "dog".toCharArray()) reqChars.set(Character.toLowerCase(c) - 'a');
  for (String w : new String[] {"god", "dogma", "megalogdon", "dorm"})
    if (hasAllChars(w, reqChars)) System.out.println(w);
}

public static boolean hasAllChars(String in, BitSet req) {
  req = (BitSet)req.clone();
  for (char c : in.toCharArray()) {
    req.set(Character.toLowerCase(c) - 'a', false);
    if (req.isEmpty()) return true;
  }
  return false;
}
于 2012-05-12T22:16:30.993 に答える
1
public static boolean containsAllCharacters(String word, Set<String> characters){
    int i = 0;
    int wordLength = word.getLength();
    while (i <= wordLength && characters.contains(word.get(i++)){}
    return i==wordLength;
}
于 2012-05-12T22:23:42.707 に答える
0

実際、この質問の最も興味深い部分は、辞書内のすべての単語を見ないようにする方法です(ただし、元のコードはそれを覆い隠しています)。それに対する潜在的に興味深い答えはこれでしょう:

  1. 出現頻度別に26文字の表を作成します。
  2. 各文字を検索し、発生頻度が最も低い文字を取得します。
  3. 次に、その文字を含む単語の照合を行います。

もちろん、これは、単一の一致が正規表現よりも安価であることを前提としています。

ここのトピックに関する素晴らしいウィキペディアのページ。この場合、違いはそれほど大きくないかもしれませんが、たとえばeとxを使用した場合は、大きくなります。

于 2012-05-12T22:44:24.613 に答える