Java中坐标读取、欧氏距离计算及最近点对求解技术咨询
嘿,作为Java新手,这个任务拆解开来其实挺容易上手的,我给你整理了详细的实现思路和代码示例,跟着走就行啦:
完整实现步骤与代码示例
1. 定义坐标存储类
首先咱们可以自定义一个简单的Point类来存储x和y坐标,这样后续操作起来更清晰:
class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } // 提供getter方法,方便获取坐标值 public double getX() { return x; } public double getY() { return y; } }
2. 读取坐标并存储
用Scanner来读取控制台输入,每行一个坐标(格式比如3 5),直到输入单独的-1时终止。把读取到的坐标都存入List<Point>中:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class ClosestPoints { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Point> points = new ArrayList<>(); System.out.println("请输入坐标(每行输入x y,输入-1终止):"); while (true) { String input = scanner.nextLine().trim(); // 检测终止条件 if (input.equals("-1")) { break; } // 分割x和y值 String[] parts = input.split("\\s+"); if (parts.length != 2) { System.out.println("请输入正确格式的坐标(x y),重新输入!"); continue; } try { double x = Double.parseDouble(parts[0]); double y = Double.parseDouble(parts[1]); points.add(new Point(x, y)); } catch (NumberFormatException e) { System.out.println("坐标值必须是数字,重新输入!"); } } scanner.close(); // 检查是否有足够的点(至少2个才能计算点对) if (points.size() < 2) { System.out.println("至少需要输入2个坐标才能计算最小距离!"); return; } // 计算并输出最小距离 double minDistance = findMinimumDistance(points); System.out.printf("距离最小的点对的距离是:%.2f%n", minDistance); }
3. 实现欧氏距离计算方法
写一个静态方法,传入两个Point对象,返回它们之间的欧氏距离:
// 计算两点间的欧氏距离 private static double calculateDistance(Point p1, Point p2) { double dx = p1.getX() - p2.getX(); double dy = p1.getY() - p2.getY(); return Math.sqrt(dx * dx + dy * dy); }
4. 寻找距离最小的点对
通过双重循环遍历所有不重复的点对,计算每对点的距离,记录最小的那个值:
// 寻找所有点对中的最小距离 private static double findMinimumDistance(List<Point> points) { double minDist = Double.MAX_VALUE; int n = points.size(); // 遍历所有不重复的点对(i从0到n-2,j从i+1到n-1) for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double distance = calculateDistance(points.get(i), points.get(j)); if (distance < minDist) { minDist = distance; } } } return minDist; } }
代码说明
- 输入处理部分做了简单的异常判断,避免用户输入错误格式的内容导致程序崩溃,新手也能轻松理解。
- 点对遍历的时候从
j = i + 1开始,避免重复计算(比如点A和点B,不用再算一次点B和点A),稍微提升了一点效率。 - 最后用
printf格式化输出结果,保留两位小数,看起来更直观。
内容的提问来源于stack exchange,提问作者Sphe
相关产品推荐
相关产品推荐

