2017-11-26 5 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> 

출력 : I 빈들을 생성 한 후이

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을 반복하고 어떤 bin 값이 속해 있는지 확인해야합니다. 다음은 예이다 :

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

등등 ...

기본적 I 범위 값이 속하는 체크하고 value position in an array (예 5에서 myArray의 위치 1이 있는지 추가해야하므로 I는 추가 할

1). 해당 bin에 대한 값을 저장합니다. 값 자체 대신 값의 위치를 ​​저장해야하는 이유가 있습니다. 가장 큰 문제는 사용자가 bin 번호를 변경하면 어떻게 작동하는지 파악하는 것입니다. 예를 들어 10 대신 사용자가 12를 선택하면 내 if 문이 달라집니다. 누구든지 도움이 될만한 도움을 제공 할 수 있다면. 미리 감사드립니다!

+0

빈 크기는 가장 높은 값과 가장 낮은 값의 * 차이 *를 기준으로 설정해야합니다. 가장 높은 가치에 기초를 둔다면 잠재적으로 빈 덩어리로 끝날 것입니다. –

답변

1

아마도 Modulo를 사용하고 싶을 것입니다. 빈을 가지고 있으면 해시하고 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 
>>> 
관련 문제