功能相同的两个Java方法,为何switch实现可用而ArrayList遍历实现不可用?
方法2无法正常运行的核心原因
- 四个if分支的判断条件完全相同,没有和遍历到的方向做对应绑定:无论当前遍历到的是
U/R/L/D中的哪一个,只要和入参匹配,就会直接命中第一个if分支,永远返回U对应的Coordinate(0,-1),完全不会触发后面三个对应其他方向的if分支,自然无法返回正确坐标。 - 例如入参为
R时,遍历到列表第二个元素(索引为1)时匹配成功,第一个if判断成立,直接返回U的坐标,不会走到对应R的第二个if分支。
简易修正方案
你可以改用Map存储方向和坐标的映射关系,代码更简洁也不会出现上述匹配错误:
Coordinate processHeadDirectionCoordinate(String directionMoved) { Map<String, Coordinate> directionMap = new HashMap<>(); directionMap.put("U", new Coordinate(0,-1)); directionMap.put("R", new Coordinate(1,0)); directionMap.put("L", new Coordinate(-1,0)); directionMap.put("D", new Coordinate(0,1)); return directionMap.getOrDefault(directionMoved, direction); }
如果要保留原有遍历写法,可以将方向和坐标按索引对应绑定即可:
Coordinate processHeadDirectionCoordinate(String directionMoved) { ArrayList<String> dirList = new ArrayList<>(); dirList.add("U"); dirList.add("R"); dirList.add("L"); dirList.add("D"); Coordinate[] coordArr = new Coordinate[]{ new Coordinate(0,-1), new Coordinate(1,0), new Coordinate(-1,0), new Coordinate(0,1) }; for(int i = 0; i < dirList.size(); i++) { if(dirList.get(i).equals(directionMoved)) { return coordArr[i]; } } return direction; }
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

