You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:15:34