2017-02-15 13 views
0

こんにちは私は、英語の単語の大きなリストを含むファイル(words.txt)をハッシュマップに読み込もうとしています。私はパスでファイルにアクセスしています。私の関数は、開かれているPathに渡され、内容をHashMapに入力しようとします。私は単語ごとにPath単語のすべての値を印刷することができますが、値をHashMapに格納するのに問題があります。私は、私のO(n)ArrayList実装よりも優れたSpellCheckerを作成しようとしています。 TrieやBKTreeで解決する前に、HashMapで解決したいと思います。パスから行ごとにHashMapに読み込む方法

要約:Pathで開いたword.txtファイルをHashMapに挿入するにはどうすればよいですか。

マイコード

private static void createMap(Path dictFile) throws Exception{ 
     Map<Integer,String> theWords = new HashMap<>(); 
     int count = 0; 

     try (Stream<String> stream = Files.lines(dictFile)) { 
      stream.forEach(theWords.put(count++, stream)); 
      //stream.forEach(System.out::println); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+2

「カウント」とは何ですか?なぜ '0、stream'を' Map'に繰り返し入れていますか?あなたはlambdaについて学ぶ必要があるかもしれません - あなたは 'forEach'を正しく使っているようには見えません。 –

+0

私はあなたがそれに鍵(整数)と文字列を与える必要があると信じています。 – Yawn

+1

'String'を値として入れているわけではなく、' Stream'を置いています。あなたはlambdaについて学ぶ必要があります。あなたは 'forEach'の引数である' Consumer 'に値を渡す必要があります。また、 'Map'にインデックスで項目を追加するだけです。' List'とどう違うのでしょうか? 'Map'を使ってあなたの目標は何ですか? –

答えて

2

System.out::printlnは、メソッドの参照であり、theWords.put(count++, stream)ではありません。また、すでにBorisによって指摘されているように、ストリームは個々の単語ではなくマップに追加されます。

正しいラムダ式はword -> theWords.put(count++, word)ようになりますが、これはまた、効果的に、最終的なもの、それはラムダ式内で変更することはできませんないcount変数にコンパイルされません。

意図はちょうどすぐに特定の単語が辞書ファイルに含まれている場合Setも十分であろうと、コードは次のようになります調べることができるようになる場合:次に単語を調べる

HashSet<String> theWords = Files.lines(dictFile) 
     .collect(Collectors.toCollection(HashSet::new)); 

例えば、大文字と小文字を区別しない検索のため

theWords.contains("hello"); 

() -> new TreeSet<>(String.CASE_INSENSITIVE_ORDER)代わりにHashSet::newを使用します。

+0

それが真実を返すとき - どうすれば実際の値にアクセスできますか?ちょうどtheWords.get(値)? – Yawn

+0

素敵な説明;良い仕事を続けてください! –

+0

私はちょうど周りに値を設定するには、一時的な文字列を返した場合には、検出されたとしての一時的な文字列が含まれている場合は、 – Yawn

関連する問題