2011-01-08 11 views
1

ファイルから単語リストを読み込み、単語の順列を見つけて、正規化された単語をすべて格納する基本プログラムを書く必要がありますバージョンを1つのチェーンにまとめる。正規化されたバージョンは常にチェーンの上に置かれます。 正規化された単語をインデックスキーとして使用する必要がありますが、単語の順列は、指定されたhsah位置に文字列の配列として返されます。JavaのScrabblecheater:ネストされたArrayListに正しく書き込む方法

入れ子のArrayListを使用して、インデックスキーと並べ替えの格納を実装しようとしました。

private File testfile = new File("wordlist.txt"); 
private ArrayList<ArrayList<String>>[] table; 
int entries = 0; 

public Dictionary(int size) { 
    table = new ArrayList[size]; 
    for (int i = 0; i < size; i++) 
    table[i] = new ArrayList<ArrayList<String>>(99); 
} 

public void newDictionary() { 
    for (int i = 0; i < table.length; i++) 
    table[i] = new ArrayList<ArrayList<String>>(99); 
} 

当社のハッシュ関数は次のようになります。

public void hash(String word) { 

    word = word.toLowerCase(); 
    String id = normalize(word); 
    int hashValue = 0; 
    char[] chars = word.toCharArray(); 

    for (int i = 0; i < chars.length; i++) { 
    int e = chars[i] - 97; 
    hashValue += e * 26^i; 
    } 

    if (hashValue < 0) 
    hashValue = hashValue * (-1); 
    ArrayList<ArrayList<String>> chain = table[hashValue]; 


    boolean newList = true; 
    boolean cB = chain.isEmpty(); 

    if (chain.size() > 0) { 
    for (int i = 0; i < chain.size(); i++) { 
    ArrayList<String> currentChain = chain.get(i); 

    try { 
    String a = currentChain.get(0); 
    System.out.println(a); 
    } catch (Exception e) { 
    System.out.println("ERROR!"); 
    } 

    } 
    } 
    if (newList == true || chain.size() == 0) { 
    chain.add(new ArrayList<String>()); 
    chain.get(0).add(0, id); 
    chain.get(0).add(word); 
    } 
} 

我々は適切例えば、ネストされたのArrayListを実装しますが、ArrayList<ArrayList<String>> chain = table[hashValue];にアクセスしようとすると仮定boolean cB = chain.isEmpty();を呼び出すと、プログラムがクラッシュします。

それ以外は、currentChainのインデックス0のすべての値を印刷することはできません。 それぞれのprint-methodをtry-catchブロックで囲みました。そうしないと、プログラムがクラッシュしました。今、私たちのプログラムが実行されますが、稀に文字列を出力しない、むしろ印刷方法を実行しているときに例外がスローされます。

try { 
    String a = currentChain.get(0); 
    System.out.println(a); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

スタックトレースは、次のエラーが出力さ:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
    at java.util.ArrayList.get(ArrayList.java:322) 
    at Dictionary.hash(Dictionary.java:78) 
    at Dictionary.readFromFile(Dictionary.java:32) 
    at Main.main(Main.java:9) 

我々はおよそかなり混乱しています次のようになります。Index: 0, Size: 0

入れ子ArrayListを正しく実装しましたか? ほとんどの場合、私たちがArrayList内にStringを正しく格納できない理由は何でしょうか?

+0

例外「処理」を実装するのは本当に恐ろしい方法です。あなたは、無駄なtry/catchブロックを追加することで、自分自身で難しいものにしています。それらを追加することを主張するならば、スタックトレースを少なくとも*印刷する必要があります。しかし、例外をキャッチするのではなく、役に立たない何かをすることはできません。 –

+0

Stacktraceはいい考えです.thx – jottr

+0

ok、stacktraceの出力を追加しました。 – jottr

答えて

0

コードを修正したい場合は、配列リストの要素が初期化されていないことを知る必要があります。

変更コンストラクタとなどnewDictionary()方法も鎖可変のdecalrationを更新することを意味し

private List<List<String>>[] table; 

:私も、テーブル部材の宣言を変更することになる

public Dictionary(int size) { 
     //noinspection unchecked 
     table = new ArrayList[size]; 

     newDictionary(); 
    } 

    public void newDictionary() { 
     for (int i = 0; i < table.length ; i++) { 
      table[i] = new ArrayList<List<String>>(99); 

      for (int j = 0; j < 99; j++) { 
       table[i].add(new ArrayList<String>()); 
      } 
     } 
    } 

ハッシュ方法からこれまで

List<List<String>> chain = table[hashValue]; 

お楽しみください。

1

Mutimapは、探しているデータ構造です。

A collection similar to a Map, but which may associate multiple values with a single key. If you call put(K, V) twice, with the same key but different values, the multimap contains mappings from the key to both values.

関連する問題