2017-12-14 25 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, THE 및 – raggy

+0

이 포함 된 경우 어떻게됩니까? 모두 동일한 것으로 간주되며 처음 발견 된 버전을 저장해야합니다. 내 문제는 텍스트에 "the"가 없더라도 "The"만있는 경우에도 원본 형식이 아닌 소문자로 모두 저장됩니다. –

답변

1

그것이 키로 ​​UniCase를 사용하는 가장 쉬운 방법 :

extern crate unicase; 

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

당신이 Unicase::new("the")와 비교하면, 당신 것, 자신의 문서, UniCase::new("The") 저장 실제 문자열 "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")); 그리고 나는 캐시리스 비교가 괜찮다는 것을 충분히 증명했다. – Boiethios

+2

@Boiethios BurntSushi5의 요지는 'UniCase'가 처리하도록 설계된 것보다 비교의 개념이 더 복잡하다는 것입니다. 예를 들어 다음과 같이 실패합니다 :'assert_eq! (UniCase :: new ("Åström"), UniCase :: new ("Åström")'(정확히 복사했는지 확인하십시오.) 크레이트는 사전 작성/- 유니 코드 텍스트 - – Shepmaster