如何在Java中高效比较两个三角形的无序内角?
高效对比两个三角形内角(不考虑顺序)
下面提供几种比堆砌if语句更简洁高效的实现方式,适用于无需考虑内角顺序的三角形对比场景:
方案1:排序后逐位对比
这是最直观且高效的方案,仅需对两组内角分别排序,再依次对比对应位置的数值。由于仅处理3个元素,排序的性能开销可以忽略不计。
import java.util.Arrays; public class TriangleComparator { public static boolean areTrianglesEqual(int[] angles1, int[] angles2) { // 基础合法性校验(可选,确保输入是有效三角形) if (angles1.length != 3 || angles2.length != 3) return false; if (calculateSum(angles1) != 180 || calculateSum(angles2) != 180) return false; // 对两组角度排序 Arrays.sort(angles1); Arrays.sort(angles2); // 逐位对比 return angles1[0] == angles2[0] && angles1[1] == angles2[1] && angles1[2] == angles2[2]; } private static int calculateSum(int[] arr) { int total = 0; for (int num : arr) total += num; return total; } public static void main(String[] args) { int[] equilateral1 = {60, 60, 60}; int[] equilateral2 = {60, 60, 60}; System.out.println(areTrianglesEqual(equilateral1, equilateral2)); // true int[] rightTri1 = {90, 45, 45}; int[] rightTri2 = {45, 90, 45}; System.out.println(areTrianglesEqual(rightTri1, rightTri2)); // true int[] scalene1 = {100, 50, 30}; int[] scalene2 = {90, 50, 40}; System.out.println(areTrianglesEqual(scalene1, scalene2)); // false } }
若处理浮点类型角度,对比时需用Math.abs(a - b) < 1e-6这类方式规避精度误差。
方案2:统计角度出现频率
针对整数角度的场景,可通过数组统计每个角度的出现次数,再对比两组统计结果是否一致。该方法无需排序,遍历两次即可完成校验。
public class TriangleComparator { public static boolean areTrianglesEqual(int[] angles1, int[] angles2) { if (angles1.length != 3 || angles2.length != 3) return false; if (calculateSum(angles1) != 180 || calculateSum(angles2) != 180) return false; int[] freq1 = new int[181]; // 角度范围限定在0-180之间 int[] freq2 = new int[181]; for (int angle : angles1) freq1[angle]++; for (int angle : angles2) freq2[angle]++; // 遍历对比频率数组 for (int i = 0; i <= 180; i++) { if (freq1[i] != freq2[i]) return false; } return true; } private static int calculateSum(int[] arr) { int total = 0; for (int num : arr) total += num; return total; } // main方法同方案1 }
方案3:利用数学特征对比
三个数不考虑顺序相等的充要条件是:它们的和、平方和、乘积均相等。该方法适用于整数和浮点类型,但浮点场景需注意精度处理。
public class TriangleComparator { public static boolean areTrianglesEqual(int[] angles1, int[] angles2) { if (angles1.length != 3 || angles2.length != 3) return false; if (calculateSum(angles1) != 180 || calculateSum(angles2) != 180) return false; int sum1 = calculateSum(angles1); int sum2 = calculateSum(angles2); if (sum1 != sum2) return false; int sumSq1 = angles1[0]*angles1[0] + angles1[1]*angles1[1] + angles1[2]*angles1[2]; int sumSq2 = angles2[0]*angles2[0] + angles2[1]*angles2[1] + angles2[2]*angles2[2]; if (sumSq1 != sumSq2) return false; int product1 = angles1[0] * angles1[1] * angles1[2]; int product2 = angles2[0] * angles2[1] * angles2[2]; return product1 == product2; } private static int calculateSum(int[] arr) { int total = 0; for (int num : arr) total += num; return total; } // main方法同方案1 }
内容的提问来源于stack exchange,提问作者diego otero
相关产品推荐
相关产品推荐

