public class DBScan { //设定一个距离分步阶梯 默认3为基础一级精度 private static final int MAX_STEP = 3; public static final Long calcMostPoint(List list,int PRE) { long selid = 0; double begin_value = 0; Double[] plusArray = new Double[list.size()]; //第一步 计算每个点与原始点的距离 存入 plusArray for (int i = 0; i < list.size(); i++) { HashMap map = (HashMap) list.get(i); if (i == 0) begin_value = new Double(map.get("value").toString()); long id = new Long(map.get("id").toString()); double value = new Double(map.get("value").toString()); plusArray[i] = value - begin_value; } //第二步 计算距离上下限距离 Double[] plusTemp = plusArray.clone(); double plus_distance = plusTemp[plusTemp.length - 1] - plusTemp[0]; //第三步 设置精度 double precision = plus_distance / (MAX_STEP+PRE); //第四步 计算每个数以精度为半径 涵盖的数量 Integer[] cn = new Integer[plusArray.length]; for (int i = 0; i < plusArray.length; i++) { int count = 0; for (int j = 0; j < plusTemp.length; j++) { double d = Math.abs(plusArray[i] - plusTemp[j]); if (d < precision) count++; } cn[i] = count; } //第五步 计算 cn中最大的点 及位置 Integer[] cntemp = cn.clone(); int pos = getPos(cn, cntemp[cn.length - 1]); if (pos==-1) return null; //第六步 找出 list 中对应pos的id HashMap map = (HashMap) list.get(pos); selid = new Long(map.get("id").toString()); return selid; } public static int findValue(Integer[] array, int key) { int left = 0; //数组第一个元素索引值 int right = array.length - 1; //数组最后一个元素的索引值 while (left <= right) { int mid = (left + right) / 2; if (array[mid] < key) { left = mid + 1; right = array.length; mid = (right - left) / 2; } else if (array[mid] > key) { right = mid - 1; left = 0; mid = (right - left) / 2; } else if (array[mid] == key) { return mid; } } return -1; //元素不在该数组中 返回 -1 } public static int getPos(Integer[] array, int key) { for(int i=0;i<array.length;i++){ if(array[i]==key) return i; } return -1; } }