(Java)实现查找点与点之间的最短距离

一、题目

题目已经讲述查找输入点与点之间的最小距离,特别需要注意的是
可能存在多个点对都符合最短距离要求,因此需要全部输出;
比如(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));
    }
}

结果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值