0

宿題のために、絞首刑執行人をだますプログラムを作成する必要があります。これを行うには、単語の文字位置を介して単語をファミリーにグループ化する方法を考え出す必要があります。たとえば、単語の長さが 4 で、"e" と推測された場合、"- - - e" となるすべての単語は、そのパターンをキーとしてハッシュマップの Arraylists の 1 つになり、"- e - -" は、キーとしてパターンを持つ同じハッシュマップの別の ArrayLists になります。私の問題は、私のプログラムがパターンを識別できるにもかかわらずです。空のセット、またはすべての単語を含む 1 つの ArrayList を返します。私は今、1時間以上さまざまなことを試してきましたが、それらを正しくグループ化できないようです. どんな助けでも大歓迎です。

import java.util.ArrayList;
import java.lang.StringBuilder;
import java.util.HashMap;

public class EvilEngine 
{
HashMap<StringBuilder, ArrayList> families = new HashMap<StringBuilder, ArrayList>();
int k = 0;
ArrayList<String> currentList = new ArrayList();
StringBuilder blankPattern = new StringBuilder("");
StringBuilder newPattern = new StringBuilder("");


public void PatternMatcher(ArrayList wordlist, char guess, Integer wordlength)
{

    String word;
    int j = 0;
    int x = 0;
    int biggest = 0;
    StringBuilder longest = null;    

    while(x < wordlist.size())
    {
        int i = 0;
        int index = 0;
        for (i=0; i < wordlength; i++)
        {
            blankPattern = blankPattern.append("-");
        }
        boolean boo = false;
        newPattern = blankPattern;
        word = (String) wordlist.get(x);
        index = word.indexOf(guess);
        while (index >= 0) 
        {
            blankPattern.setCharAt(index, guess);
            newPattern = blankPattern;
            index = word.indexOf(guess, index + 1);
        }
        this.PatternCompiler(word,newPattern);
        blankPattern = blankPattern.delete(0,wordlength);
        x++;
    }
}
public void PatternCompiler (String word, StringBuilder pattern)
{
        if(!families.containsKey(pattern))
        {
            ArrayList<String> newPatternList = new ArrayList();
            newPatternList.add(word);
            families.put(pattern, newPatternList);
        }
        if (families.containsKey(pattern))
        {
            ArrayList<String> oldPatternList = new ArrayList();
            oldPatternList = families.get(pattern);
            oldPatternList.add(word);
            families.put(pattern, oldPatternList);
        }
        else {
            System.out.println("Error");
        }

}
public HashMap<StringBuilder, ArrayList> returnFamilies (){
    return families;
}
}
4

1 に答える 1

0

あなたのコードには多かれ少なかれ小さな問題がいくつかありますが、主な問題HashMapは. キー オブジェクトの関数を使用して、マップ内に既に存在するかどうかを判断します。の場合、ハッシュ値はおそらくオブジェクトのアドレスになります (クラスから継承された実装を使用)。 StringBuilderStringHashMaphashCode()StringBuilderObject

newPatternはスコープが関数の外にあるクラス レベルの変数であるため、関数に渡すと、PatternCompiler()そのパラメータpattern同じクラス レベルのオブジェクトへの参照になります (つまり、同じハッシュ コードを持ちます)。また、このオブジェクト (およびそのハッシュ コード) は、クラス レベルでも宣言されているため、コード内で変更されることはありません。したがって、ループを介して毎回再割り当てしても何も変わりません (そして基本的に混乱します)。blankPatternblankPatternnewPatternwhile

これを修正するには、 の代わりにのキー タイプを作成するHashMap必要があります。このクラスは、文字列の実際の内容に応じて異なるコードを返す関数を定義します (のようなオブジェクトのアドレスだけではありません)。(また、示されているように、関数内ではなくクラス レベルで宣言する理由はなく、まったく必要ありません。)StringStringBuilderStringhashCode()StringBuilderblankPatternPatternMatcher()newPattern

それがコードの主な問題でしたが、別のかなり大きな問題は、関数の 2 番目のif条件に関係していますPatternCompiler()。前のifブロックでは、新しい ArrayList をファミリーに追加します (パターン用の ArrayList がない場合)。したがって、何があっても、2 番目のif条件 ( if (families.containsKey(pattern))) はその時点で true になります。両方のブロックwordが のリストに追加されるためfamilies、一部の単語が 2 回追加される可能性があります。

幸運を!

于 2013-04-25T05:57:38.597 に答える