【发布时间】:2020-11-13 07:29:25
【问题描述】:
我的代码有效,但它仅适用于初始切割值。我应该在 getLetterGrade 方法中使用二进制搜索算法来获得所需的结果,但每次我都只能得到一个结果。
Spring bean 类
public class Grade implements GradeI {
private String name;
private int[] gradeBoundary = {100, 90, 85, 80, 77, 73, 70, 0};
private String[] gradeLetter = {"A+", "A", "A-", "B+", "B", "B-", "F"};
private int count = 8;
//private int key = 50;
int result = Arrays.binarySearch(gradeBoundary, 80);
private String gradeLetterValue = null;
public Grade() {
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setGradeBoundary(int[] grade) {
this.gradeBoundary = grade;
}
public int[] getGradeBoundary() {
return gradeBoundary;
}
public void setGradeLetter(String[] gradeLet) {
this.gradeLetter = gradeLet;
}
public String[] getGradeLetter() {
return gradeLetter;
}
public void setCount(int count) {
this.count = count;
}
public int getCount() {
return count;
}
public String getLetterGrade(int numerical_grade) {
if (numerical_grade < 70) {
gradeLetterValue = "F";
} else if (numerical_grade < 73) {
gradeLetterValue = "B-";
} else if (numerical_grade < 77) {
gradeLetterValue = "B";
} else if (numerical_grade < 80) {
gradeLetterValue = "B+";
} else if (numerical_grade < 85) {
gradeLetterValue = "A-";
} else if (numerical_grade < 90) {
gradeLetterValue = "A";
} else if (numerical_grade < 100) {
gradeLetterValue = "A+";
}
return gradeLetterValue;
}
}
主类
public class GradeApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("GradeBeans.xml");
Grade obj = (Grade) context.getBean("grade-bean");
for(int i =66; i <=100; i++) {
System.out.println(i+":"+ obj.getLetterGrade(i));
}
}
}
The desired outcome is like this :
66:F 67:F 68:F 69:F 70:B-
71:B- 72:B- 73:B 74:B 75:B
76:B 77:B+ 78:B+ 79:B+ 80:A-
81:A- 82:A- 83:A- 84:A- 85:A
86:A 87:A 88:A 89:A 90:A+
91:A+ 92:A+ 93:A+ 94:A+ 95:A+
96:A+ 97:A+ 98:A+ 99:A+ 100:A+
以下是我对二分搜索的尝试,当我在主程序中运行此代码时,我得到的唯一结果是 B+
public String getLetterGrade(int numerical_grade) {
int result = Arrays.binarySearch(gradeBoundary, 0, 7, 80);
if (result == 6) {
gradeLetterValue = "F";
} else if (result == 5) {
gradeLetterValue = "B-";
} else if (result == 4) {
gradeLetterValue = "B";
} else if (result == 3) {
gradeLetterValue = "B+";
} else if (result == 2) {
gradeLetterValue = "A-";
} else if (result == 1) {
gradeLetterValue = "A";
} else if (result == 0) {
gradeLetterValue = "A+";
}
return gradeLetterValue;
}
我的问题是如何使用二进制搜索来获得所需的结果
更新
最适合我的解决方案是创建自己的二进制搜索算法并使用它来查找字母,如下面的代码
public String getLetterGrade(int numerical_grade) {
int low = 0;
int index = count - 1;
int max = (low + index) / 2;
while (low < index - 1) {
max = (low + index) / 2;
if (this.gradeBoundary[max] <= numerical_grade)
index = max;
else
low = max;
}
if (low == index - 1) max = low;
return gradeLetter[max];
}
【问题讨论】:
-
如果我将代码格式化为可读状态,你会反对吗?
-
完全没有,如果更容易阅读的话
-
好的,完成,这实际上是你的工作。现在看起来 switch 语句将是比所有这些 if 更好的选择。或者
Map<Integer, String>没有考虑过这个问题。顺便说一句,IDE 有自动格式化命令。
标签: java binary-search spring-bean