我觉得应该有一个可用的库来更简单地做两件事,A)在双精度的情况下找到数组的模式,B)优雅地降低精度,直到达到特定频率。
所以想象一个这样的数组:
double[] a = {1.12, 1.15, 1.13, 2.0, 3.4, 3.44, 4.1, 4.2, 4.3, 4.4};
如果我正在寻找频率 3,那么它将从小数点后 2 位到小数点后 1 位,最后返回 1.1 作为我的模式。如果我的频率要求为 4,它将返回 4 作为我的模式。
我确实有一组代码按我想要的方式工作,并返回我所期望的,但我觉得应该有一种更有效的方法来实现这一点,或者一个现有的库可以帮助我做同样的事情。附件是我的代码,我会对我应该采取的不同方法的想法/评论感兴趣....我列出了迭代以限制精度降低的程度。
public static double findMode(double[] r, int frequencyReq)
{
double mode = 0d;
int frequency = 0;
int iterations = 4;
HashMap<Double, BigDecimal> counter = new HashMap<Double, BigDecimal>();
while(frequency < frequencyReq && iterations > 0){
String roundFormatString = "#.";
for(int j=0; j<iterations; j++){
roundFormatString += "#";
}
DecimalFormat roundFormat = new DecimalFormat(roundFormatString);
for(int i=0; i<r.length; i++){
double element = Double.valueOf(roundFormat.format(r[i]));
if(!counter.containsKey(element))
counter.put(element, new BigDecimal(0));
counter.put(element,counter.get(element).add(new BigDecimal(1)));
}
for(Double key : counter.keySet()){
if(counter.get(key).compareTo(new BigDecimal(frequency))>0){
mode = key;
frequency = counter.get(key).intValue();
log.debug("key: " + key + " Count: " + counter.get(key));
}
}
iterations--;
}
return mode;
}
编辑
根据 Paulo 的评论,另一种表述问题的方法是:目标是找到一个数字,其中邻域中至少有frequency
数组元素,邻域的半径尽可能小。