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 + -
显示快捷键?