错误一:
未读明白题目:题中说是
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
这说明是移动的数字长度在两位之内那就是包括两位数字和一位数字,
也就是想A7是合法的。但是自己错认为是只能是两位数字。
错误二
对能输入数据认识不全面,输入的字符串可以是空的也可以是长度为1、2、3、4及以上,但是只考虑了长度大于3和长度为1的情况。
if (s.length()>3 || s.length()==0)
应该考虑全面,合法的字符包括长度为2和3的
if (s.length()!=3 || s.length()!=2)
不足
未学习到正则表达式,使得代码写得又臭又长
if (s.length()!=3 || s.length()!=2)
continue;
else if(! hashSet.contains(s.charAt(0)))
continue;
else if(s.length()==2 && !(Character.isDigit(s.charAt(1))))
continue;
else if ( s.length()==3 && (!Character.isDigit(s.charAt(1))) | (!Character.isDigit(s.charAt(2)))) {
continue;
}else
sList.add(s);
以上代码等价于:
if (!s.matches("[WASD][0-9]{1,2}"))
continue;
else
sList.add(s);
给出垃圾的完整代码:
import java.util.*;
public class Main2 {
public static void main(String[] args) {
HashSet<Character> hashSet = new HashSet<>();
hashSet.add('A');
hashSet.add('D');
hashSet.add('W');
hashSet.add('S');
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] ss = str.split(";");
ArrayList<String> sList = new ArrayList<>();
for(String s : ss){
//if (s.length()>3 || s.length()==0) 这种就是错误的写法容易发生数组越界错误,因为当输入的是长度为2的字符时,
//下面的第二个else if就发生了月结错误,因此我们要考虑到所有的输入可能,这个字符长度可能是0,1,2,3,4,更多
if (s.length()!=3 && s.length()!=2)
continue;
else if(! hashSet.contains(s.charAt(0)))
continue;
else if(s.length()==2 && !(Character.isDigit(s.charAt(1))))
continue;
else if ( s.length()==3 && (!Character.isDigit(s.charAt(1))) | (!Character.isDigit(s.charAt(2)))) {
continue;
}else
sList.add(s);
/*
if (!s.matches("[WASD][0-9]{1,2}"))
continue;
else
sList.add(s);
*/
}
int x=0;
int y=0;
int slide = 0;
for (String sub : sList)
System.out.println(sub);
for (String s:sList){
slide = Integer.parseInt(s.substring(1));
switch (s.charAt(0)){
case 'A': x = x - slide;
break;
case 'S':y = y-slide;
break;
case 'W':y = y + slide;
break;
case 'D':x =x + slide;
}
}
System.out.println(x + "," + y);
}
}