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

Java实现数组满足至少一条规则的函数:其余规则实现求助

实现Java函数判断数组是否满足水平、垂直或对角线规则

你已经搞定了水平规则的判断,下面逐个实现剩下的三个规则,最后整合为一个完整的判断函数:


水平规则(已实现,封装为方法)

先把你写的逻辑封装成可复用的方法:

private static boolean isHorizontalEqual(String[] arr) {
    if (arr == null || arr.length == 0) return false;
    Set<String> set = new HashSet<>(Arrays.asList(arr));
    return set.size() == 1;
}

垂直规则实现

要满足垂直规则,首先得保证所有行的长度一致,不然没法按列比较。然后对每一列,检查该列所有行的对应字符是否完全相同:

private static boolean isVerticalEqual(String[] arr) {
    if (arr == null || arr.length == 0) return false;
    int colLength = arr[0].length();
    // 先校验所有行长度一致
    for (String row : arr) {
        if (row.length() != colLength) {
            return false;
        }
    }
    // 遍历每一列,检查列内字符是否全相同
    for (int col = 0; col < colLength; col++) {
        char targetChar = arr[0].charAt(col);
        for (int row = 1; row < arr.length; row++) {
            if (arr[row].charAt(col) != targetChar) {
                return false;
            }
        }
    }
    return true;
}

左对角线规则实现

左对角线指的是行索引 - 列索引的值相同的所有位置(也就是从左上延伸到右下的斜线),这些位置的字符必须全部一致。比如3行3列的数组里,(0,0)、(1,1)、(2,2)属于同一个左对角线,(1,0)、(2,1)是另一个,依此类推。

我们可以用Map来记录每个对角线对应的目标字符,遍历所有字符时检查是否符合:

private static boolean isLeftDiagonalEqual(String[] arr) {
    if (arr == null || arr.length == 0) return false;
    int rowCount = arr.length;
    int colCount = arr[0].length();
    // 校验所有行长度一致
    for (String row : arr) {
        if (row.length() != colCount) {
            return false;
        }
    }
    Map<Integer, Character> diagMap = new HashMap<>();
    for (int i = 0; i < rowCount; i++) {
        for (int j = 0; j < colCount; j++) {
            int key = i - j; // 左对角线的唯一标识
            char currentChar = arr[i].charAt(j);
            if (diagMap.containsKey(key)) {
                if (diagMap.get(key) != currentChar) {
                    return false;
                }
            } else {
                diagMap.put(key, currentChar);
            }
        }
    }
    return true;
}

右对角线规则实现

右对角线是行索引 + 列索引的值相同的所有位置(从右上延伸到左下的斜线),比如3行3列数组里,(0,2)、(1,1)、(2,0)属于同一个右对角线,(0,1)、(1,0)是另一个。

实现逻辑和左对角线类似,只是用i+j作为对角线的标识:

private static boolean isRightDiagonalEqual(String[] arr) {
    if (arr == null || arr.length == 0) return false;
    int rowCount = arr.length;
    int colCount = arr[0].length();
    // 校验所有行长度一致
    for (String row : arr) {
        if (row.length() != colCount) {
            return false;
        }
    }
    Map<Integer, Character> diagMap = new HashMap<>();
    for (int i = 0; i < rowCount; i++) {
        for (int j = 0; j < colCount; j++) {
            int key = i + j; // 右对角线的唯一标识
            char currentChar = arr[i].charAt(j);
            if (diagMap.containsKey(key)) {
                if (diagMap.get(key) != currentChar) {
                    return false;
                }
            } else {
                diagMap.put(key, currentChar);
            }
        }
    }
    return true;
}

整合所有规则的主函数

最后写一个主函数,只要数组满足任意一条规则就返回true:

public static boolean satisfiesAnyRule(String[] arr) {
    if (arr == null || arr.length == 0) return false;
    return isHorizontalEqual(arr) 
        || isVerticalEqual(arr) 
        || isLeftDiagonalEqual(arr) 
        || isRightDiagonalEqual(arr);
}

测试示例

用你给出的例子测试:

public static void main(String[] args) {
    // 水平规则测试
    String[] horizontalTest = {"AA", "AA", "AA"};
    System.out.println(satisfiesAnyRule(horizontalTest)); // 输出true

    // 垂直规则测试
    String[] verticalTest = {"AB", "AB", "AB"};
    System.out.println(satisfiesAnyRule(verticalTest)); // 输出true

    // 左对角线规则测试
    String[] leftDiagTest = {"ABC", "BAC", "CBA"};
    System.out.println(satisfiesAnyRule(leftDiagTest)); // 输出true

    // 右对角线规则测试
    String[] rightDiagTest = {"ACB", "CBA", "BAC"};
    System.out.println(satisfiesAnyRule(rightDiagTest)); // 输出true
}

内容的提问来源于stack exchange,提问作者Tuna Kahraman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:22:40