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
相关产品推荐
相关产品推荐

