第一学期课程数组x长度>1时PreRequist方法逻辑异常咨询
问题分析与修复:多门第一学期课程时的先修课逻辑错误
你遇到的这个问题很典型——当第一学期课程数组x[]只注册1门课的时候逻辑完全正常,但一旦注册2门及以上,整个判断逻辑就乱套了。而且第二学期的y[]不管多长都不影响,问题完全出在x[]的遍历逻辑上。
先看看你的核心代码:
public static void PreRequist(int x[],int y[]){ for (int i=0;i<y.length;i++){ if(y[i]==4){ for(int j=0;j<x.length;j++){ if(x[j]!=1){ toString(courseName(4),courseName(1)); } } } } }
问题根源
你的内层遍历逻辑完全错了:
当x[]有多个元素时,只要其中某一门课不是1,就会触发一次toString调用。比如x = [2,1],第一次循环x[0]=2≠1会调用一次,第二次x[1]=1不调用;但如果x = [2,3],会连续调用两次toString——这显然不是你想要的,你应该是想判断整个第一学期是否完全没修过课程1,而不是每遇到一门非1的课就触发提示。
修复方案
我们需要先通过标记变量确认x[]中是否存在课程1,再统一判断是否触发提示,而不是逐个元素判断:
public static void PreRequist(int x[], int y[]) { // 遍历第二学期的每一门课程 for (int i = 0; i < y.length; i++) { // 如果第二学期选了课程4 if (y[i] == 4) { boolean hasTakenCourse1 = false; // 检查第一学期是否修过课程1 for (int j = 0; j < x.length; j++) { if (x[j] == 1) { hasTakenCourse1 = true; break; // 找到目标课程就停止遍历,提升效率 } } // 只有完全没修过课程1时,才触发先修课提示 if (!hasTakenCourse1) { toString(courseName(4), courseName(1)); } } } }
修复点说明
- 新增
hasTakenCourse1标记变量,默认值为false - 遍历
x[]时,只要找到课程1就把标记设为true并跳出循环(没必要继续遍历剩余元素) - 最后仅在标记为
false(即完全没修过课程1)时调用toString,保证无论x[]有多少门课,只会触发一次提示,符合先修课的逻辑要求
可选优化(Java 8+)
如果你的项目使用Java 8或更高版本,可以用流操作简化判断逻辑,代码更简洁:
import java.util.Arrays; public static void PreRequist(int x[], int y[]) { for (int course : y) { if (course == 4) { boolean hasTakenCourse1 = Arrays.stream(x).anyMatch(num -> num == 1); if (!hasTakenCourse1) { toString(courseName(4), courseName(1)); } } } }
这里用Arrays.stream(x).anyMatch(...)直接判断数组中是否存在课程1,省去了手动写循环的麻烦,可读性也更强。
内容的提问来源于stack exchange,提问作者Khalid Omar
相关产品推荐
相关产品推荐

