一、题目描述

描述
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; ; YAD; 等。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
A10 = (-10,0)
S20 = (-10,-20)
W10 = (-10,-10)
D30 = (20,-10)
x = 无效
A1A = 无效
B10A11 = 无效
一个空 不影响
A10 = (10,-10)
结果 (10, -10)
注意请处理多组输入输出
输入描述:
一行字符串
输出描述:
最终坐标,以逗号分隔

二、题解

本题难点有两处,一是理解坐标系,二是排除干扰项;

1、理解坐标系

首先建立一个坐标系,分别由x轴,y轴;
A是向左,即A10 为 x - 10;
W是向上,即W20 为 y + 20;
S是向下,即S10 为 y - 10;
D是向右,即D20 为 x + 20;

2、排除干扰项

根据题目,可使用以下排除法排除干扰项:
每项有2-3个字符;
第0个字符必须为大写的AWSD其中的一个;
后面的字符必须是数字;(使用Character.isDigit() 或 ascii码 或 正则来判断)

三、java实现

import java.util.Scanner;

/**
 * @author zhangnianlei
 * @description
 * @date 2021/8/2
 */
public class Main {

    private final static String DIR_ABCD = "AWDS";

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String[] s = sc.nextLine().split(";");
            System.out.println(dealPosition(s));
        }
    }


    private static String dealPosition(String[] s) {

        int x = 0, y = 0;
        for (String each : s) {

            // 根据字符串(A10)构建一个指令对象,为空代表无效指令
            MoveOrder order = new MoveOrder().getMoveOrderByStr(each);
            if (null == order) continue;

            if ("A".equals(order.direction)) {
                x -= order.distance;
            } else if ("D".equals(order.direction)) {
                x += order.distance;
            } else if ("W".equals(order.direction)) {
                y += order.distance;
            } else {
                y -= order.distance;
            }
        }
        return x + "," + y;
    }


    /**
     * @description 内部类:指令对象
     * @author zhangnianlei
     * @date 2021/8/2
     * @throws
     * @modifier
     */
    public static class MoveOrder {

        /**
         * 移动方向
         */
        String direction;

        /**
         * 移动距离
         */
        Integer distance;

        public MoveOrder() {
        }

        public MoveOrder(String direction, Integer distance) {
            this.direction = direction;
            this.distance = distance;
        }

        /**
         * @description 根据字符串(A10)构建一个指令对象,返回为null代表无效指令
         * @author zhangnianlei
         * @date 2021/8/2
         * @throws
         * @param: str
         * @return: MoveOrder
         * @modifier
         */
        public MoveOrder getMoveOrderByStr(String str) {
            if (null == str || str.length() == 0) return null;
            if (str.length() > 3) return null;
            String dir = String.valueOf(str.charAt(0));
            if (DIR_ABCD.indexOf(dir) <= -1) return null;

            for (int i = 1; i < str.length(); i++) {
                if (!Character.isDigit(str.charAt(i))) {
                    return null;
                }
            }

            String num = str.substring(1, str.length());
            MoveOrder order = new MoveOrder(dir, Integer.valueOf(num));
            return order;
        }

    }

}