testjava.java
来自「一个基于网格和最近邻居的聚类算法 Similarity(x, y) = siz」· Java 代码 · 共 430 行 · 第 1/2 页
JAVA
430 行
package Test;
import java.util.ArrayList;
public class TestJava {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// System.out.println("");
double[][] numberPoint = {{1.4,1.4}, {1.5,1.5}, {1.6,1.6}, {2.6,2.6}, {13.6,13.6}};
//System.out.print(checkPoint(a));
int minX = 0;
int maxX = 100;
int minY = 0;
int maxY = 100;
double d = 10;
int areaCount = ((int)((maxX - minX)/d)*(int)((maxY - minY)/d));
ArrayList[] list = new ArrayList[areaCount];
ArrayList<String> listXY = new ArrayList<String>();
for (int i = 0; i < (int)((maxX - minX)/d); i++){
for (int j = 0; j < (int)((maxY - minY)/d); j++){
listXY.add(String.valueOf(i) + "," + String.valueOf(j));
}
}
for (int i = 0; i < listXY.size(); i++){
list[i] = new ArrayList();
list[i].add(listXY.get(i));
// System.out.println(listXY.size());
// System.out.println(list[i]);
}
for (int i = 0; i < numberPoint.length; i++){
double pointX = numberPoint[i][0];
double pointY = numberPoint[i][1];
int pointXArea = (int)((pointX-minX)/d);
int pointYArea = (int)((pointY-minY)/d);
String strPointArea = String.valueOf(pointXArea) + "," + String.valueOf(pointYArea);
for (int j = 0; j < areaCount; j++){
String areaSign = (String)(list[j].get(0));
if (strPointArea.equals(areaSign)){
list[j].add(String.valueOf(pointX) + "," + String.valueOf(pointY));
}
}
}
// System.out.println(getPointX("0,0"));
// System.out.println(getPointY("0,0"));
// System.out.println(list[11]);
ArrayList[] listPointArea = addPoint(minX, maxX, minY, maxY, d, areaCount, list);
// for (int i = 0; i < listPointArea.length; i++){
// System.out.println(listPointArea[i]);
// }
ArrayList[] pointListK = new ArrayList[numberPoint.length];
int numberPointCount = 0;
for (int i = 0; i < list.length; i++){
if (list[i].size() == 1){
continue;
}
for (int j = 1; j < list[i].size(); j++){
pointListK[numberPointCount] = competePoint(list, listPointArea, i, j);
numberPointCount++;
}
}
for (int i = 0; i < pointListK.length; i++){
System.out.println(pointListK[i]);
}
System.out.println("");
// find k
for (int i = 0; i < pointListK.length; i++){
String pointK = String.valueOf(pointListK[i].get(0));
for (int j = 1; j < pointListK[i].size(); j++){
String pointKOther = String.valueOf(pointListK[i].get(j));
for (int k = 0; k < pointListK.length; k++){
String pointKTemp = String.valueOf(pointListK[k].get(0));
if (pointKOther.equals(pointKTemp) && !pointListK[k].contains(pointK)){
pointListK[i].remove(pointKOther);
j--;
break;
}
}
}
}
for (int i = 0; i < pointListK.length; i++){
System.out.println(pointListK[i]);
}
}
private static ArrayList competePoint(ArrayList[] list, ArrayList[] listPointArea, int i, int j){
int count = 4;
int listSize = list[i].size();
int listPointAreaSize = listPointArea[i].size();
ArrayList[] pointNearList = new ArrayList[listSize];
pointNearList[j] = new ArrayList();
ArrayList[] pointNearDistanceList = new ArrayList[listSize];
pointNearDistanceList[j] = new ArrayList();
String strPointList = (String) (list[i].get(j));
pointNearList[j].add(strPointList);
pointNearDistanceList[j].add(0);
double douPointX = Double.valueOf(getPointX(strPointList));
double douPointY = Double.valueOf(getPointY(strPointList));
for (int k = 0; k < listPointAreaSize; k++) {
String strPointlistPointArea = (String) (listPointArea[i].get(k));
double douAreaPointX = Double
.valueOf(getPointX(strPointlistPointArea));
double douAreaPointY = Double
.valueOf(getPointY(strPointlistPointArea));
double distance = java.lang.Math.sqrt((douPointX - douAreaPointX)
* (douPointX - douAreaPointX) + (douPointY - douAreaPointY)
* (douPointY - douAreaPointY));
if (distance!= 0) {
pointNearList[j].add(strPointlistPointArea);
pointNearDistanceList[j].add(distance);
}
}
if (pointNearList[j].size() > (1+count)){
pointNearList[j] = removePointK(pointNearList[j], pointNearDistanceList[j], count);
}
return pointNearList[j];
}
private static ArrayList removePointK(ArrayList pointNearList, ArrayList pointNearDistanceList, int count){
while(pointNearList.size() > (1 + count))
{
double tempDistance = 0;
for (int i = 1; i < pointNearList.size(); i++){
String strDistance = String.valueOf(pointNearDistanceList.get(i));
double distance = Double.valueOf(strDistance);
if (distance >= tempDistance){
tempDistance = distance;
}
}
int maxDistanceIndex = pointNearDistanceList.indexOf(tempDistance);
pointNearDistanceList.remove(maxDistanceIndex);
pointNearList.remove(maxDistanceIndex);
}
return pointNearList;
}
private static ArrayList[] addPoint(int minX, int maxX, int minY, int maxY, double d, int areaCount, ArrayList[] list) {
ArrayList[] listPointArea = new ArrayList[areaCount];
for (int i = 0; i < areaCount; i++){
String areaId = (String)(list[i].get(0));
int pointXIndex = Integer.parseInt(getPointX(areaId));
int pointYIndex = Integer.parseInt(getPointY(areaId));
listPointArea[i] = new ArrayList();
for (int h = 1; h < list[i].size(); h++){
listPointArea[i].add(list[i].get(h));
}
if (pointXIndex == minX && pointYIndex == minY){
String strPointArea1 = String.valueOf(pointXIndex + 1) + "," + String.valueOf(pointYIndex);
String strPointArea2 = String.valueOf(pointXIndex + 2) + "," + String.valueOf(pointYIndex);
String strPointArea3 = String.valueOf(pointXIndex) + "," + String.valueOf(pointYIndex + 1);
String strPointArea4 = String.valueOf(pointXIndex) + "," + String.valueOf(pointYIndex + 2);
String strPointArea5 = String.valueOf(pointXIndex + 1) + "," + String.valueOf(pointYIndex + 1);
String strPointArea6 = String.valueOf(pointXIndex + 2) + "," + String.valueOf(pointYIndex + 1);
String strPointArea7 = String.valueOf(pointXIndex + 1) + "," + String.valueOf(pointYIndex + 2);
String strPointArea8 = String.valueOf(pointXIndex + 2) + "," + String.valueOf(pointYIndex + 2);
for (int j = 0; j < areaCount; j++){
String areaSign = (String)(list[j].get(0));
if (areaSign.equals(strPointArea1) ||
areaSign.equals(strPointArea2) ||
areaSign.equals(strPointArea3) ||
areaSign.equals(strPointArea4) ||
areaSign.equals(strPointArea5) ||
areaSign.equals(strPointArea6) ||
areaSign.equals(strPointArea7) ||
areaSign.equals(strPointArea8))
{
for (int k = 1; k < list[j].size(); k++){
listPointArea[i].add(list[j].get(k));
}
}
}
}
else if (pointXIndex == maxX && pointYIndex == minY){
String strPointArea1 = String.valueOf(pointXIndex - 1) + "," + String.valueOf(pointYIndex);
String strPointArea2 = String.valueOf(pointXIndex - 2) + "," + String.valueOf(pointYIndex);
String strPointArea3 = String.valueOf(pointXIndex) + "," + String.valueOf(pointYIndex + 1);
String strPointArea4 = String.valueOf(pointXIndex) + "," + String.valueOf(pointYIndex + 2);
String strPointArea5 = String.valueOf(pointXIndex - 1) + "," + String.valueOf(pointYIndex + 1);
String strPointArea6 = String.valueOf(pointXIndex - 2) + "," + String.valueOf(pointYIndex + 1);
String strPointArea7 = String.valueOf(pointXIndex - 1) + "," + String.valueOf(pointYIndex + 2);
String strPointArea8 = String.valueOf(pointXIndex - 2) + "," + String.valueOf(pointYIndex + 2);
for (int j = 0; j < areaCount; j++){
String areaSign = (String)(list[j].get(0));
if (areaSign.equals(strPointArea1) ||
areaSign.equals(strPointArea2) ||
areaSign.equals(strPointArea3) ||
areaSign.equals(strPointArea4) ||
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?