2017-01-19 10 views
1

この周波数検索プログラムをJavascriptで書き直そうとしています。ここではJavaコードは次のとおりです。文字コードを使用して文字列内の単語の頻度を取得するJavaScript

public class frequency { 
    public static void main(String[] args){ 
     String S = "Temple University"; 
     int[] p = new int[256]; 
     for (char c :S.toCharArray()) { 
      p[c]++; 
      System.out.println(c +" shows up "+p[c] + " times"); 
     } 

出力:

T shows up 1 times 
e shows up 1 times 
m shows up 1 times 
p shows up 1 times 
l shows up 1 times 
e shows up 2 times 
    shows up 1 times 
U shows up 1 times 
n shows up 1 times 
i shows up 1 times 
v shows up 1 times 
e shows up 3 times 
r shows up 1 times 
s shows up 1 times 
i shows up 2 times 
t shows up 1 times 
y shows up 1 times 

しかし、私のJavaScriptの実装は全く動作しません:

function frequency(){ 
    s = "Temple University"; 
    str = s.split(''); 
    p = []; 
    p.length = 256; 
    console.log("start"); 
    for(c in str){ 
    p[c]++; 
    console.log("inside" + c); 
    console.log(String.fromCharCode(c) + " shows up " + p[c] + "times"); 
    } 
} 

それは私が理解しようとしてきた後半ですこのJavaScriptコードが動作しない理由を説明してください。この投稿が未審査であればごめんなさい。

答えて

1

これがうまくいかない主な理由は、forループがJavaとは異なる動作をJavascriptで行うことです。 JavaScriptでは、オブジェクトのプロパティを通じてfor-inループ繰り返し処理ではなく、配列や文字列のインデックス、そうではなくfor-in、あなたがそうのように、無地forループを使用したいと思います:

function getFrequencies(string) { 
    if (typeof(string) !== 'string') { 
     throw new Error('string argument is not of type string.'); 
    } 

    var str = string.split(''); 
    var frequencies = {}; 
    for (var c = 0; c < str.length; c++) { 
     var charCode = String.fromCharCode(str[c]); 
     if (!frequencies[charCode]) { 
      frequencies[charCode] = 1; 
     } else { 
      frequencies[charCode]++; 
     } 
    } 

    return frequencies; 
} 

Aカップルのヒント:ユニークな値を数えているので、配列([])の代わりにプレーンなオブジェクト({})を使用したいと思うでしょう。第2に、Javascriptで配列の長さを宣言する必要はありません。配列は自動的にサイズが変更されてサイズが変更され、lengthプロパティは読み込み専用です。

+0

私はあなたの答えが与える洞察が好きですが、私はあなたのコードを実行するとすべてが1の頻度で戻ってくるのですか?また、この場合、配列上でオブジェクトを使用する必要がある理由について詳しく説明することもできます。なぜオブジェクトは一意の値を数えるのに適しているのですか?これを実行するとパフォーマンス上のメリットはありますか? – coderrick

+0

オブジェクトを使用する主な理由の1つは、配列が一般的にコレクションとして使用され、 'push'と' unshift'で追加され、 'for'ループまたはforEach'関数で反復処理されることです。したがって、配列は値のグループとして考えられ、それぞれが連続したインデックスを持ちます。あなたがそれをやっているやり方では、インデックスは必ずしも連続しているわけではないので、配列に対して意味のある繰り返しをすることは不可能です。パフォーマンスは実際問題ではありません。 – furkle

+0

@ cododerまた、コードに小さな誤字がありました。今すぐ動作するはずです。 – furkle

1

そんなに文字列全体を反復処理するためにループに使用する値1.

を割り当てる配列として直接文字列を操作し、他の文字の発生のための安全なチェックを必要とすることができますsと文字を抽出することができ、[インデックス]のpを使用しながら、出現頻度の[char]。

サンプルコードはい

function frequency(){ 
 
    s = "Temple University"; 
 
    p = []; 
 
    console.log("start"); 
 
    for(var i=0;i<s.length;i++){ 
 
    if(!p[s[i]]){ 
 
     p[s[i]] = 1; 
 
    }else{ 
 
     p[s[i]]++; 
 
    } 
 
    console.log(s[i] + " shows up " + p[s[i]] + "times"); 
 
    } 
 
} 
 

 
frequency()

1

あなたのためにこの作品を以下の?もしそうなら、あなただけの、次のようにあなたが行うことができます。..

function frequency() { 
 
\t s = "Temple University"; 
 
\t str = s.split(''); 
 
\t p = []; 
 
\t p.length = 256; 
 
\t console.log("start"); 
 
\t for (c in str) { 
 
\t \t var curChar = str[c]; 
 
\t \t var charCode = curChar.charCodeAt(); 
 
\t \t p[charCode] ? p[charCode]++ : p[charCode] = 1; 
 

 
\t \t console.log(curChar + " shows up " + p[charCode] + " time(s)"); 
 
\t } 
 
} 
 

 
frequency()

0

をcharCodeはなく、文字列内の文字のインデックスを参照していませんでした。

var s = "Temple University", 
 
fmap = Array.prototype.reduce.call(s,(p,c) => (p[c] ? p[c]++ : p[c] = 1,p),{}); 
 
for(var i in fmap) console.log(i, "shows up", fmap[i],"times.");

我々は関数法.call()を使用して、文字列の上に配列数子Array.prototype.reduce()を使用しています。したがって、.call()に渡される最初の引数は、文字列の項目(文字)ごとに呼び出される第2引数の文字列s(呼び出すコンテキストの指定)とコールバック((p,c) => (p[c] ? p[c]++ : p[c] = 1,p))です。 .reduce()ファンクタは、空白のオブジェクト{}を初期値として使用し、pに割り当てられます。一方、cは、最初のターンの最初の文字に割り当てられます。fmapというマップが生成されます。

{ T: 1, 
    e: 3, 
    m: 1, 
    p: 1, 
    l: 1, 
    ' ': 1, 
    U: 1, 
    n: 1, 
    i: 2, 
    v: 1, 
    r: 1, 
    s: 1, 
    t: 1, 
    y: 1 } 

そしてfor inループがマップキー上に横切り、我々はconsole.log()命令によって得られたデータを表示します。

+0

機能的で多少モナディックなソリューションをありがとう。しかし、私はコードを理解できないのですか?フラットマップを使用する意味は何ですか(私は関数型プログラミングに関しては緑色です)。 JavaScriptの健全な関数型プログラミングを学ぶための優れたブログも知っていますか? – coderrick

関連する問題