案例: 输入儿童性别,年龄(0~18),身高,输出身高测试结果
二维数组方式
/**
* @author Hua
* @create 2022-10-07 10:19
* 输入儿童性别,年龄(0~18),身高,输出身高测试结果
*/
@Slf4j
public class branchTest {
public static void main(String[] args) {
// 测试数据,只有1,2岁...
String[][] TableMale = new String[][]{{"1", "71.2", "73.8", "76.5", "79.3"}, {"2", "81.6", "85.1", "88.5", "92.1"}};
String[][] TableFemale = new String[][]{{"1", "69.7", "72.3", "75.0", "77.7"}, {"2", "80.5", "83.8", "87.2", "90.7"}};
Scanner input = new Scanner(System.in);
log.debug("请输入性别");
String gender = input.nextLine();
log.debug("请输入年龄");
int age = input.nextInt();
log.debug("请输入身高");
Double height = input.nextDouble();
if ("男".equals(gender)) {
for (int i = 0; i < TableMale.length; i++) {
String[] lines = TableMale[i];
GetGrade(age, height, lines);
}
} else if ("女".equals(gender)) {
for (int i = 0; i < TableFemale.length; i++) {
String[] lines = TableFemale[i];
GetGrade(age, height, lines);
}
}
}
public static void GetGrade(int age, Double height, String[] lines) {
if (age == Double.valueOf(lines[0])) {
if (0 < height && height < Double.valueOf(lines[1])) {
log.debug("矮小");
} else if (Double.valueOf(lines[1]) < height && height < Double.valueOf(lines[2])) {
log.debug("偏矮");
} else if (Double.valueOf(lines[2]) < height && height < Double.valueOf(lines[3])) {
log.debug("标准");
} else if (Double.valueOf(lines[3]) < height) {
log.debug("超高");
}
}
}
}
小结分析
- 需要改善的地方: 数据合法性校验, 效率性能问题没有考虑,采用数组的话,需要全部索引一遍才能找到数据,而使用map容器的话,就可以直接提取,
- 该方法难点是存入map容器的数据需要提前设计好,后期用到的所有数据都直接从容器获取,还有一点是获取数据的时候需要切割,需要熟练掌握常用的MapAPI
HashMap方式
public class Height {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:"); // 输入儿童的信息
String info = scanner.nextLine();
int age;
String sex;
float height = 0.0f;
String[] strinfo = null;
while (!info.equalsIgnoreCase("exit")) {
strinfo = info.split(",");
if (info == null || strinfo.length != 3) {
System.out.println("输入信息错误,请按照指定格式给定!\n请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:");
info = scanner.nextLine();
} else {
if (!isInteger(strinfo[1]) || !isFloat(strinfo[2]) ) {
System.out.println("输入信息错误,年龄和身高请输入数值类型的数据!\n请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:");
info = scanner.nextLine();
} else {
age = Integer.parseInt(strinfo[1]);
height = Float.parseFloat(strinfo[2]);
sex = strinfo[0].trim();
if(!(0<age && age<200 )|| !(0<height && height<200)){
System.out.println("输入信息错误,年龄和身高请输入合法范围数据!\n请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:");
info = scanner.nextLine();
}else {
if (sex.equals("男") || sex.equals("女")) {
System.out.println("评测结果:"+getGrade(sex+"-"+age,height));
System.out.println("请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:");
info = scanner.nextLine();
} else {
System.out.println("输入信息错误,性别只能是男或者是女!\n请输入儿童性别,年龄,身高 (如:男,13,167.8),exit退出:");
info = scanner.nextLine();
}
}
}
}
}
System.out.println("程序已退出,感谢使用!");
}
// 判定字符串是否为整数
public static boolean isInteger(String s) {
try {
Integer.parseInt(s);
return true;
} catch (Exception ex) {
return false;
}
}
// 判定字符串是否为浮点数
public static boolean isFloat(String s) {
try {
Float.parseFloat(s);
return true;
} catch (Exception ex) {
return false;
}
}
public static boolean isContain(String start, String end, float height) {
if (start == "0.0") {
if (height < Float.parseFloat(end)) {
return true;
} else {
return false;
}
} else if (end == "0.0") {
if (height >= Float.parseFloat(start)) {
return true;
} else {
return false;
}
} else {
if (height >= Float.parseFloat(start) && height < Float.parseFloat(end)) {
return true;
} else {
return false;
}
}
}
public static String getGrade(String key,float height) {
Map info = new HashMap<String, String>();
String hinfo[]=null;
String fdinfo[]=null;
String result ="";
//男孩信息录入
info.put("男-1", "0.0-73.8:矮小;73.8-76.5:偏矮;76.5-79.3:标准;79.3-0.0:超高");
info.put("男-2", "0.0-85.1:矮小;85.1-88.5:偏矮;88.5-92.1:标准;92.1-0.0:超高");
info.put("男-3", "0.0-93.0:矮小;93.0-96.8:偏矮;96.8-100.7:标准;100.7-0.0:超高");
//女孩信息录入
info.put("女-3", "0.0-91.8:矮小;91.8-95.6:偏矮;95.6-99.4:标准;99.4-0.0:超高");
if(info.containsKey(key)) {
hinfo = info.get(key).toString().split(";");
for(String str:hinfo) {
fdinfo = str.split(":")[0].split("-");
result =str.split(":")[1];
if(isContain(fdinfo[0],fdinfo[1],height)) {
break;
}
}
return result;
}else {
return "儿童年龄需要在1~18岁之间";
}
}
}
小结分析
使用HashMap之后,提高了数据的查询速度,节省了CPU资源.
代码也增加了数据有效性验证,强化了代码的健壮性