2017-11-26 1 views
0

私は、ユーザーがビンの数を入力する必要があるプロジェクトを持っています。この数値の範囲は0〜1000です。たとえば、ユーザーが10を選択した場合は、次に配列内の最高値をチェックします。配列は数値を保持します。ここに例があります:ビンを動的に作成しますか?

<cfset myArray = [5,45.74,9,21,88.78,33.56,12]> 

私は配列の中で最高の値を見つける必要があります。例えば、上記の配列の中で最も高い値は88.78です。この値を89に丸めることができます。次に、最高値をビンの数で割ります。それから私は各ビンの幅を設定することができます。例:

<!--- *** Get the highest value in an array. Based on the max value in the array we will now how many bins we need. *** ---> 
<cfset maxBinVal = Round(arrayMax(myArray))> 

<!--- *** This value can be changed. Depends how many bins user wants. *** ---> 
<cfset numberOfBins = 10> 

<!--- *** Divide highest value in the array with the number of bins. *** ---> 
<cfset binWidth = maxBinVal/numberOfBins> 

<!--- *** Loop stops before hits the highest value. Increment for binWidth to include the highest value. *** ---> 
<cfset maxVal = maxBinVal + binWidth> 
<cfset arrayOfBins = arrayNew(1)> 

<cfloop from="#binWidth#" to="#maxVal#" step="#binWidth#" index="i"> 
    <cfset arrayAppend(arrayOfBins,#i#)> 
</cfloop> 

<cfloop array="#arrayOfBins#" index="key"> 
    <cfoutput>Bin Point: #key#<br></cfoutput> 
</cfloop> 

出力:

Bin Point: 8.9 
Bin Point: 17.8 
Bin Point: 26.7 
Bin Point: 35.6 
Bin Point: 44.5 
Bin Point: 53.4 
Bin Point: 62.3 
Bin Point: 71.2 
Bin Point: 80.1 
Bin Point: 89 

私は、次のステップは、正しいビン/配列にmyArrayから各値を配置することであるビンを作成した後。これは手間がかかり、この問題のための最良のアプローチ/解決策は何か分かりません。ビンの数が静的/常に同じ場合、これは簡単です。この場合、私はmyArrayをループして、どのビン値が属するかをチェックする必要があります。次に例を示します。

<cfif 5 LTE 8.9> 
    <cfset arrayAppend(array1, 5)> 
<cfelseif 5 GT 8.9 AND 5 LTE 17.8> 
    <cfset arrayAppend(array2, 5)> 
<cfelseif ...> 

のように...

は基本的に私は、範囲値が属するチェックしvalue position in an array(例5は、myarrayの位置1を持っているので、私は追加したいことを追加する必要が1)、そのビンの値を格納します。値自体の代わりに値の位置を格納しなければならない理由があります。最大の問題は、ユーザーがビン番号を変更した場合にこれがどのように機能するかを理解することです。たとえば、10の代わりに、ユーザーが12を選択すると、if文が異なることになります。誰かが助けてくれる助けを誰でもできたら。前もって感謝します!

+0

ビンサイズは、最高値と最低値の*差*に基づいて設定する必要があります。もしあなたがそれを最も高い価値に基づいているのであれば、あなたは潜在的に空の箱を一杯にするでしょう。 –

答えて

1

おそらく、モジュロを使用したいと思います。ビンを持っていれば、それをハッシュして、ビンのO(1)ルックアップのためにマップを使うことができます。

>>> getBin = lambda x: x - (x % 8.9) 
>>> getBin(0) 
0.0 
>>> getBin(8.7) 
0.0 
>>> getBin(8.9) 
8.9 
>>> getBin(11) 
8.9 
>>> getBin(20) 
17.8 
>>> getBin(89.9) 
89.0 
>>> 
関連する問題