You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串转为网格并提取指定字符对应的整数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:27:02