输入一段程序代码,要你找出bug,有两种bug,一是引用未赋值变量,二是下标越界。
思路:有两个map,一个用来记录每个元素对应的值,map<元素,值>,例如a[0]=>1,a[2]=>3,b[2]=>12之类的,前面的a[0],a[2],b[2]就是map的key,而值就是value
另外一个用来记录数组大小,形式是map2<a[,12>,其中a[表明是数组a,12是指大小
首先是声明数组,例如a[9]
我们切割字符串,取出a[,取出9,将两个构成键值对,存入map2中,于是其中就有a[=>9,说明了a数组的大小
然后是赋值语句,例如a[0]=1
首先根据等号切割,然后使用一个getvalue()函数,这个函数可以获取值(如果是整数,就返回整数本身,如果是元素,就查找map表,返回对应的值)
右边直接使用getvalue()就可以了,左边要先切割字符串,取出a[,然后用getvalue()获取对应0的值,当然0只是一个例子,它也可以是更复杂的元素嵌套,但是我们在可以在getvalue里面使用递归解决
在getvalue中我们要判断是否越界,这个越界判断只要跟map2比较就好了
如果没有越界,右边就是要赋的值
左边会得到a[0..9]的形式(也就是去除了嵌套)
最后将a[0..9]和值作为键值对加入map
package test;
import java.util.HashMap;
import java.util.Scanner;
public class Test{
static HashMap<String,Integer> map = new HashMap<String,Integer>();//记录a[0..9]对应的值
static HashMap<String,Integer> map2 = new HashMap<String,Integer>();//记录a[]数组的大小
static Integer getValue(String s){//获取值
if(s.indexOf("[")==-1){//如果是数字,直接返回数字
return Integer.valueOf(s);
}
//不是数字,说明是数组形式
String s0 = s.substring(0, s.indexOf("[")+1);//获取数组的标记a[
String s1 = s.substring(s.indexOf("[")+1,s.lastIndexOf("]"));//获取index
if(s1.indexOf("[")==-1){//如果index为数字,说明s是a[0..9]的形式
if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(s1)){//s1是否溢出
System.out.println("下标溢出");
System.exit(0);
}
if(map.get(s0+s1+"]")!=null){//是否初始化变量
return map.get(s0+s1+"]");
}else{
System.out.println("该值未初始化");
System.exit(0);
}
}else{//s是嵌套形式a[a[a[0...9]]]..
int index = getValue(s1);//递归获取
if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(index)){//检查是否溢出
System.out.println("下标溢出");
System.exit(0);
}
if(map.get(s0+index+"]")!=null){
return map.get(s0+index+"]");
}else{
System.out.println("该值未初始化");
System.exit(0);
}
}
return null;
}
static void getArr(String s){//记录数组和其大小
map2.put(s.substring(0, s.indexOf("[")+1),
Integer.valueOf(s.substring(s.indexOf("[")+1,s.indexOf("]"))));
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line;
while(!"end".equals((line=scanner.nextLine()))){
if(line.indexOf("=")==-1){//说明是a[0..9]形式的数组声明
getArr(line);
}else{//说明是赋值
String ss = line.substring(0,line.indexOf("="));//根据等号切割
String s0 = line.substring(0,ss.indexOf("[")+1);
String s2 = line.substring(ss.indexOf("[")+1,ss.lastIndexOf("]"));
String s1 = line.substring(line.indexOf("=")+1);
if(map2.get(s0)==null || map2.get(s0)<=getValue(s2)){
System.out.println("下标溢出");
System.exit(0);
}
map.put(s0+getValue(s2)+"]",getValue(s1));
}
System.out.println(map);
System.out.println(map2);
}
scanner.close();
}
}