import java.util.*;
/**
* 需求:在较大的范围内有很多个点,取出n个点,这n个点要“随机”的均匀分布,不能太集中。
* 聚类运算基本实现:假设有n个二维点(x,y),把这n个点分割成m*m个格子.如m=4,即16个格子.取出10个点,这些点在格子范围内,每个格子只取一次.
* @author paulliu
* 以下是我第一个版本,之所以拿出来“献丑”,主要是和大家讨论并且让不了解的朋友能有基本认识
* ,避免犯我同样“错误”。
*
*/
public class CluArray {
private static double minX;
private static double minY;
private static ArrayList resultVec;
public CluArray() {
}
/**
* 聚类运算
* @param arrayList ArrayList
*/
public static ArrayList clusterArray(ArrayList listarray) {
ArrayList result = new ArrayList(); //返回结果list
resultVec = new ArrayList(); //保存了分类后坐标点序列
ArrayList xypoint = new ArrayList(); //初始化坐标点
for (int i = 0; i < listarray.size(); i++) {
String string = listarray.get(i).toString(); //格式[name,layerid,uid,fid,cx,cy]
String[] pointxy = string.split(",");
String id = pointxy[2];//uniqueid
String x = pointxy[4];
String y = pointxy[5];
//保存坐标点
Point point = new Point();
double id0 = Double.parseDouble(id);
point.setId(id0);
double x0 = Double.parseDouble(x);
point.setX(x0);
double y0 = Double.parseDouble(y);
point.setY(y0);
xypoint.add(point);
}
cluster3(xypoint); //调用聚类方法
if (xypoint != null) {
xypoint = null;
}
for (int i = 0; i < resultVec.size(); i++) {
for (int j = 0; j < listarray.size(); j++) {
String string = listarray.get(j).toString(); //格式[name,layerid,uid,fid,cx,cy]
String[] pointxy = string.split(",");
double id1 = Double.parseDouble(pointxy[2]);
double id2 = ( (Point) resultVec.get(i)).getId();
if (id1 == id2) {
result.add(string);
}
}