2016-11-16 9 views
1

私は新しいです、そしてReaderオブジェクトを単語ごとに分割し、単語が見つかった時間を記録するプログラムをセットアップしようとしています。ここまで私がこれまで持っていたことがあります。Goを使用して特定の単語を検索する

func Occurrences(word string, s io.Reader) (uint, error) { 
    scanner := bufio.NewScanner(strings.NewReader(s)) 

    // Split the reader into words 
    var word_count int // Number of the specific word found 
    scanner.Split(budfio.ScanWords) 
    for scanner.Scan() { 

    } 
} 

どこから行くのかわかりません。私が探している言葉と何を比較するのか分かりません。どんな助けもあります

+2

符号なしの値がビット単位のオペレーションのために確保されるべきであるスキャナに現在文字列トークンを有する単語列を比較します。ここには「理由」はありません。 – JimB

+0

これは奇妙なコメントです。あなたはintとuintの両方にbitwise opsを使うことができます(しかし、私はそれがずっとずっと面倒であると同意します)。あなたはintより2倍高いintを数えることもできます。これは負の単語数が決して得られない状況ではここで働きます。 – dragonx

+0

@dragonx:算術演算で使用されるすべての値の符号なしの値を避けるのが一般的に認められています。負の数を期待していないかもしれませんが、署名されていない値が発生したときにそのバグを簡単にキャッチするつもりはありません。 Goはすべてのカウントとインデックス作成操作に符号付きの値を使用していることに気付くでしょう。 「2倍の高さ」は実際には良い引数ではなく、わずか1ビットの違いです。特に整数値が必要な場合は非常に特殊なケースになります(2 << 63,2 "64) - おそらくあなたはその時点で任意の精度の整数を探しているでしょう。 – JimB

答えて

0

最も簡単なことは、キーが単語であり、値がその単語のカウントであるmap[string]intを使用することです。

最初に表示されたときに各単語をマップに追加し、その後にその都度カウントを増やす必要があります。

3

func Occurrences(word string, r io.Reader) (int, error) { 
    scanner := bufio.NewScanner(r) 

    wordCount := 0 
    scanner.Split(bufio.ScanWords) 
    for scanner.Scan() { 
     if scanner.Text() == word { 
      wordCount++ 
     } 
    } 
    return wordCount, scanner.Err() 
} 

https://play.golang.org/p/gfl1jjM9Bd

関連する問題