如何将字符串转为网格并提取指定字符对应的整数x、y坐标
需求说明
将多行字符串格式的网格地图作为输入,根据传入的目标字符提取对应点位的整数型x、y坐标。
原实现代码如下:
String map = ""+ "--------\n"+ "| R* |\n"+ "| F |\n"+ "--------"; public void findCord(String map, char object) { String lines[] = map.split("\\n"); int getYCord = 0; int getXCord = 0; Point testPoint = new Point(getXCord, getYCord); for(int i =0; i< lines.length; i++) { if(lines[i].indexOf(object) != -1 ) { getXCord = lines[i].indexOf(object); } if(lines[i].indexOf(object) == -1) { getYCord = getYCord +1; } testPoint = new Point(getXCord -1, getYCord -1); } System.out.println("Cords test: "+ testPoint); }
原代码测试问题:当传入参数object为F时,输出为(1,2);当查找字符R时,输出为(4,2),与实际网格位置不符。
问题分析
原代码的核心错误有3处:
- y坐标累加逻辑错误:只要当前行没找到目标就累加y,即使目标已经在前面的行找到,后续遍历仍会继续累加y,导致最终y坐标偏大
- 坐标赋值逻辑错误:每轮循环都会覆盖坐标值,即使当前行没有目标,也会用之前的x和错误累加的y生成坐标
- 没有提前终止逻辑:找到目标后不需要继续遍历剩余行,浪费性能同时还会触发y坐标累加的问题
修复后实现
以下实现默认坐标规则为:网格内部有效区域左上角第一个空格为(0,0),忽略外层的边框字符-和|,返回第一个匹配到的目标字符坐标,如需返回所有匹配目标可自行调整逻辑:
import java.awt.Point; public class MapCoordinateFinder { // 示例网格地图 String sampleMap = ""+ "--------\n"+ "| R* |\n"+ "| F |\n"+ "--------"; public void findCoordinate(String map, char target) { String[] lines = map.split("\\n"); Point targetPoint = null; // 遍历每一行,行号y直接对应原始网格的纵向坐标 for (int y = 0; y < lines.length; y++) { int x = lines[y].indexOf(target); // 找到目标字符 if (x != -1) { // 坐标偏移:x减1排除每行开头的|边框,y减1排除顶部的-边框 targetPoint = new Point(x - 1, y - 1); // 只找第一个匹配的话直接终止循环 break; } } // 输出结果 if (targetPoint != null) { System.out.println("坐标测试: " + targetPoint); } else { System.out.println("未找到目标字符"); } } // 测试方法 public static void main(String[] args) { MapCoordinateFinder finder = new MapCoordinateFinder(); finder.findCoordinate(finder.sampleMap, 'F'); // 输出:坐标测试: (1,1) finder.findCoordinate(finder.sampleMap, 'R'); // 输出:坐标测试: (3,0) } }
如果你的坐标规则不需要排除边框,直接把new Point(x - 1, y - 1)修改为new Point(x, y)即可。
内容的提问来源于stack exchange,提问作者S. Gaines
相关产品推荐
相关产品推荐

