一、题目
题目已经讲述查找输入点与点之间的最小距离,特别需要注意的是
可能存在多个点对都符合最短距离要求,因此需要全部输出;
比如(1,1) (2,2) (3,3)
这里就有两对点都符合(1,1) (2,2) 和 (2,2) (3,3)
二、代码
注意:
(1)实现输入格式(x,y)格式输入
(2)使用 Point 类型记录每个点
(3)使用 Map 接口下的:TreeMap 和 IdentifyMap
(4)Map 接口的类型是Map<Double, List<Point>>
,其中Double表示距离,List<Point>
表示一对点集合:比如(3,{(1,1),(2,2)})
import java.awt.*;
import java.util.*;
import java.util.List;
public class Root {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入坐标的个数:");
int numberOfPoints = input.nextInt();
// 创建坐标数组,存储形式(x,y)
Point[] points = new Point[numberOfPoints];
// 初始化坐标数组
for (int i = 0; i < numberOfPoints; i++) {
System.out.print("输入第" + (i + 1) + "个点的坐标(x,y):");
//这里设定输入格式,并对其进行处理
String str1 = input.next();
String[] str2 = str1.split(",");
int p1 = Integer.parseInt(str2[0]);
int p2 = Integer.parseInt(str2[1]);
points[i] = new Point(p1,p2);
}
// Map 接口可以操作一对对象,每个元素都使用 key->value 的形式存储在集合中
// Map 的子类 TreeMap 可以按照 key 进行排序,这里我们选两点的距离作为key,但是不允许重复利用特性可以得到最小距离即第一个值key
// Map 的子类 IdentityHashMap,允许重复
//初始化,距离是 double,对应的是一对值,即两个点,所以用 list接口也就是集合存储
Map<Double, List<Point>> mapTree = new TreeMap<>();
Map<Double, List<Point>> mapIdentity = new IdentityHashMap<>();
// 这里计算每对点的距离然后存储到 mapTree 和 mapIdentify 中
for (int i=0;i<numberOfPoints-1;i++){
for (int j=i+1;j<numberOfPoints;j++){
double distanst = distance(points[i],points[j]);
// 使用 allList 存储一对点,即 i,j 两点的值,
List<Point> allList = new ArrayList<Point>();
allList.add(points[i]);
allList.add(points[j]);
mapTree.put(distanst,allList);
mapIdentity.put(distanst,allList);
}
}
// 在mapTee中得到排序后的第一个key
double key = mapTree.keySet().iterator().next();
// 在所有存储值中查找和key 相等的 map 集合
for (Map.Entry<Double,List<Point>> me:mapIdentity.entrySet()){
if (me.getKey()==key){
System.out.println(me.getKey() + "--->" + me.getValue());
}
}
}
// 计算两点之间的距离
public static double distance(Point p1,Point p2){
return Math.sqrt(Math.pow((p1.x-p2.x),2) + Math.pow((p1.y-p2.y),2));
}
}
结果如图: