2016-09-28 5 views
0

ユーザーが段落を入力すると、javascriptは各単語の頻度をカウントし、最大値から最小値まで出力します。私はすでに2つの配列を使って各単語の数を数えます。しかし、カウントと単語が2つの異なる配列に格納されているので、その量に基づいて印刷する方法はわかりません。私を助けてください。ありがとうございました!各文字列のJavascript count frenquencyを最大値から最小値まで出力する

<!DOCTYPE html> 
<html> 
<head> 
<title> practice </title> 
<style> 
.field{ 
font-size: 10px;/
width: 400px; 
} 
</style> 

</head> 
<body> 

<p> This progam will calculate what you want to</p> 

<p id="demo"></p> 
<p id="result"></p> 
<input type="text" id="paragraph" class="field",> 
<button onclick="input()"><b>Submit</b></button> 


<script> 
function input() { 
var test = document.getElementById("paragraph").value; 
var arr =[]; 
arr = test.toLowerCase().split(" "); 
document.getElementById("demo").innerHTML = arr; 

function foo(arr) { 

    var a = [], b = [], prev; 

    arr.sort(); 
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] !== prev) { 
      a.push(arr[i]); 
      b.push(1); 
     } else { 
      b[b.length-1]++; 
     } 
     prev = arr[i]; 
    } 

    return [a, b]; 
} 

var result = foo(arr); 
document.write('[' + result[0] + ']<br>[' + result[1] + ']') 
} 

</script> 
</body> 
</html> 
+2

代わりに2つの配列のマップまたはオブジェクトの配列を使用します。 –

+0

既にこのコードをすべて持っているので、 'b'の数を調べるだけで' a'をソートすることができます。しかし、これは非常に悪い解決策であり、実装やメンテナンスが容易ではないかもしれません。非常に簡単な方法は、 'split' - >' reduce' - > 'sort'を実行することで、コード全体を10行未満で実装できるため、完全に書き直すことです。 – vlaz

+0

私は以前にはreduceを使っていません。私はインターネットでそれを調べた。定義は「reduce()メソッドは配列を単一の値に減らす」と述べています。ユーザー入力を個々の単語の配列に分割した後、どのようにreduce()を使用しますか?あなたはそれについてもう少し詳しく説明できますか?ありがとうございました –

答えて

0

配列bのすべての要素が配列aの要素と相対的なので、降順で配列を並べ替えることで簡単に達成できます。例: - [aaa、hello] [1,3]は "aaa"の1つの周波数と "hello"の3つの周波数を示します。降順でB配列をソートすると[3,1]になり、同じループで配列aのすべての値を入れ替えると問題が解決します。

<!DOCTYPE html> 
<html> 
<head> 
<title> practice </title> 
<style> 
.field{ 
font-size: 10px;/
width: 400px; 
} 
</style> 

</head> 
<body> 

<p> This progam will calculate what you want to</p> 

<p id="demo"></p> 
<p id="result"></p> 
<input type="text" id="paragraph" class="field",> 
<button onclick="input()"><b>Submit</b></button> 


<script> 
function input() { 
var test = document.getElementById("paragraph").value; 
var arr =[]; 
arr = test.toLowerCase().split(" "); 
document.getElementById("demo").innerHTML = arr; 

function foo(arr) { 

    var a = [], b = [], prev; 

    arr.sort(); 
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] !== prev) { 
      a.push(arr[i]); 
      b.push(1); 
     } else { 
      b[b.length-1]++; 
     } 
     prev = arr[i]; 
    } 

//Code modification by Dixit starts 
    //Sorting the arrays in descending order 
    for(i=0;i<b.length; i++) 
    { 
     for(j=i+1;j<b.length; j++) 
     { 
      if(b[i] < b[j]) 
      { 
       var temp = b[j]; 
       b[j] = b[i]; 
       b[i]= temp; 

       var temp1 = a[j]; 
       a[j] = a[i]; 
       a[i]= temp1;     
      }      
     } 
    } 
    //Sorting the arrays in descending order 
//Code modification by Dixit ends 
    return [a, b]; 
} 

var result = foo(arr); 



    document.write('[' + result[0] + ']<br>[' + result[1] + ']') 
} 




</script> 
</body> 
</html> 

私はバブルソート手法を例に使用していますが、最悪の場合の時間複雑度は0(N^2)です。入力の数に応じて任意のソート手法を使用できます。私の試しベロー

+0

ありがとう、Dixit。私の元のコードに基づいて私の問題を解決します。しかし、私はその問題を理解するのが非常に悪い選択だと思われます。私はそれを行うより簡単な方法を見つけようとします。 –

0

あなたはこの試みることができるArray map

var test = "a a b c a 4 3 fff 3 9 fff 9 bb" 
 
var arr =[]; 
 
arr = test.toLowerCase().split(" "); 
 

 

 
function sortProperties(obj) 
 
{ 
 
    // convert object into array 
 
    var sortable=[]; 
 
    for(var key in obj) 
 
     if(obj.hasOwnProperty(key)) 
 
      sortable.push([key, obj[key]]); // each item is an array in format [key, value] 
 

 
    // sort items by value 
 
    sortable.sort(function(a, b) 
 
    { 
 
     var x=a[1], 
 
      y=b[1]; 
 
     return x>y ? -1 : x<y ? 1 : 0; 
 
    }); 
 
    return sortable; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ] 
 
} 
 

 
function calculate(myArr) { 
 
var result = {}; 
 
    myArr.map(function(item){ 
 
     if (!result[item]){ 
 
     result[item]=1; 
 
     } 
 
     else { 
 
     result[item]++; 
 
     } 
 
    },result); 
 
    return sortProperties(result); 
 
} 
 

 
var result = calculate(arr); 
 
console.log(result);

1

を使用して:あなたのデータを挿入

1-:同じオブジェクト内の単語と単語の数

2 - キーを使用してこのオブジェクトをソートするcount

<p id="demo"></p> 
 
<p id="result"></p> 
 
<input type="text" id="paragraph" class="field",> 
 
<button onclick="input()"><b>Submit</b></button> 
 

 

 
<script> 
 
function input() { 
 
var test = document.getElementById("paragraph").value; 
 
var arr =[]; 
 
arr = test.toLowerCase().replace(/[^a-zA-Z ]/g, "").split(/\s+/); 
 
    /*remove all special characters: there remove anything that's not letter*/ 
 
    /*or replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '') --> place all characters you want to avoid here */ 
 
document.getElementById("demo").innerHTML = arr; 
 

 
function foo(arr) { 
 

 
    var a = []; 
 
    var new_item; 
 
    var counter=0; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     new_item=true; 
 
     for (var j = 0; j < a.length; j++) { 
 
      if(a[j]['word']== arr[i]){ 
 
       a[j]['count'] ++; 
 
       new_item=false; 
 
      } 
 
     } 
 
     if(new_item){ 
 
     a[counter] = {}; a[counter]["word"] = arr[i];a[counter]["count"] = 1; 
 
     counter ++; 
 
     } 
 
     
 
    } 
 
    a.sort(function(a,b) { 
 
     return parseInt(b.count) - parseInt(a.count); 
 
    }); 
 
    return a; 
 
    } 
 

 
    var result = foo(arr); 
 
    for (var i = 0; i < result.length; i++) { 
 
     document.write("you wrote :"+result[i]['word']+" "+result[i]['count']+" times<br/>"); 
 
    } 
 
    
 
    
 
} 
 

 
</script>

+0

ありがとう!アマニ、それは本当に明快でストレートです。 new_item = trueとnew_item = falseを使用する目的は何かを説明できますか?ありがとうございます –

+0

単語とカウント単語のオブジェクトを作成している間、私はこの単語がオブジェクト内にない場合、この単語がオブジェクト内に存在しない場合は、私はこの単語の数を増やすでしょう。 –

+0

そして 'test.toLowerCase()。split(" ")より' test.toLowerCase()。split(/ \ s + /) 'を使う方が良いでしょう。余分な空白は単語としてみなされません。 –

関連する問題