2017-12-14 21 views
1

私は単語がテキストに現れる回数を数えようとしています。私はHashMapを使用していますが、実装では大文字と小文字を区別しません。大文字と小文字を区別しない文字列をHashMapキーとして使用する効率的な方法はありますか?

for line in reader.lines() { 
    for mut curr in line.as_ref().unwrap().split_whitespace() { 
     match word_map.entry(curr.to_string().to_lowercase()) { 
      Entry::Occupied(entry) => { 
       *entry.into_mut() += 1; 
      } 
      Entry::Vacant(entry) => { 
       entry.insert(1); 
      } 
     } 
    } 
} 

が、私は「」と「」同じことを考えたいが、「」が表示されない場合は、単に「」HashMapに保持する:私は変換することにより、すべての単語を小文字にすることを実現します。今、私は小文字ですべての単語を保持します。これを行う効率的な方法はありますか?

+1

テキストに「THE」と「 – raggy

+0

」が含まれているとどうなるでしょうか?それらはすべて同じものとみなされ、最初に見つかったバージョンを保存する必要があります。私の問題は、テキストに "the"がなくても "The"だけがある場合でも、元の形ではなくすべて小文字で保存されています。 –

答えて

1

それを行うための最も簡単な方法は、キーとしてUniCaseを使用することです:

extern crate unicase; 

type Words = std::collections::HashMap<UniCase, u32>; 

私はそれで自分のドキュメント、UniCase::new("The")店舗実際の文字列"The"を理解していれば、あなたはUnicase::new("the")と比較した場合、あなたは意志同じ文字列であることを確認してください。

+2

私は、正常化が起こっていないので、箱が正しいカスレスな比較を実装しているとは思わない。 'caseless'木枠は正しく動作しますが(APIは異なるので、両者の間にトレードオフがあります):https://docs.rs/caseless/0.2.0/caseless/ – BurntSushi5

+0

@ BurntSushi5 Hum、 assert_eq!(UniCase :: new( "Maße")、UniCase :: new( "MASSE"));そして、私はカスレス比較がOKであることを十分に証明しています。 – Boiethios

+2

@Boiethios私は、BurntSushi5のポイントは、比較のコンセプトは、「UniCase」が処理するように設計されているよりも複雑であると考えています。例えば、これは失敗します: 'assert_eq!(UniCase :: new("Åström ")、UniCase :: new("Åström ")'(必ずコピーしてください) (例:@ Unicodeテキストを含む) – Shepmaster

関連する問題