Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java)如何解析具有多种可能格式的坐标字符串,并将其转换为整数?_Java_String_Parsing_Format_Coordinates - Fatal编程技术网

(Java)如何解析具有多种可能格式的坐标字符串,并将其转换为整数?

(Java)如何解析具有多种可能格式的坐标字符串,并将其转换为整数?,java,string,parsing,format,coordinates,Java,String,Parsing,Format,Coordinates,我有一个方法,它从用户那里接收(X,Y)坐标字符串。X和Y坐标的范围都在0到8之间,坐标可以是五种可能的格式之一: (4,3):括号中的X和Y坐标,用逗号分隔,没有空格 4 3:X和Y坐标仅用空格分隔,无括号 4,3:X和Y坐标仅用逗号分隔,无括号 d3:用字母表示的X。0=A,1=B,…,8=H。X和Y之间用空格隔开 d3:除无空格外,与上述内容相同 我遇到的问题是开发一个可以成功解析所有四种格式的方法。更具体地说,我希望成功地将X和Y坐标转换为两个独立的整数,并将它们存储在某个位置,而不

我有一个方法,它从用户那里接收(X,Y)坐标字符串。X和Y坐标的范围都在0到8之间,坐标可以是五种可能的格式之一:

  • (4,3):括号中的X和Y坐标,用逗号分隔,没有空格
  • 4 3:X和Y坐标仅用空格分隔,无括号
  • 4,3:X和Y坐标仅用逗号分隔,无括号
  • d3:用字母表示的X。0=A,1=B,…,8=H。X和Y之间用空格隔开
  • d3:除无空格外,与上述内容相同
我遇到的问题是开发一个可以成功解析所有四种格式的方法。更具体地说,我希望成功地将X和Y坐标转换为两个独立的整数,并将它们存储在某个位置,而不管使用哪种格式


我对java有些陌生,没有太多解析字符串的经验。任何指针都会被欣赏。

首先让我们考虑一个主格式。我们希望将所有这些转换为的格式,以便最终将它们转换为两个整数。让我们用空格分隔两个数字。这是最容易解析的

然后,让我们考虑所有这些模式。例如,第一个输入必须只有一个括号,这样我们就可以很容易地识别出来。第三个是guarrenteed,需要包含逗号,但不包含括号。所以,我们可以用一个规则来分组,如果有逗号,去掉括号(如果有),并用空格替换逗号

还剩三个,还剩两个

现在,最后两个有什么共同点?他们共用一封信。我们可以很容易地用正则表达式捕捉到这封信,但让我们稍后再担心。那么,让我们制定一个逻辑规则

如果这个短语没有逗号, 我们检查它是否有一封信。如果有,我们检查它是否有空间。 如果是这样,我们按空格分割,并用其整数等距替换字符,正确偏移以表示其在字母表中的位置。 否则,我们使用正则表达式按字母拆分,并执行上述操作

现在,我们在脑海中有了一个清晰的形象,我们想完成什么,让我们自己去做吧

这就是我在代码中所做的

  public int[] parseXYCoord(String s) {
    String master=s;
    if(s.contains(",")){
        master=master.replace("(","").replace(")","");
        master=master.replace(","," ");
    }else if(master.matches("^[a-z]((\\s[0-8])|[0-8])$")){
        int charValue=master.charAt(0)-'a'+1;
        master=charValue+" "+master.charAt(master.contains(" ")?2:1);


    }
    return parseMaster(master);
}

private int[] parseMaster(String master) {
    if(!master.matches("^[0-8] [0-8]$"))
        throw new IllegalArgumentException("Inputted Number is incorrect!");
    String[] splitMaster=master.split(" ");
    return new int[]{Integer.parseInt(splitMaster[0]),Integer.parseInt(splitMaster[1])};

}
我不太擅长正则表达式。虽然它很难看,但它确实完成了任务。如果你想学习如何使用正则表达式,请访问该网站

使用

    System.out.println(Arrays.toString(parseXYCoord("4,3")));
    System.out.println(Arrays.toString(parseXYCoord("4 3")));
    System.out.println(Arrays.toString(parseXYCoord("(4,3)")));
    System.out.println(Arrays.toString(parseXYCoord("d3")));
    System.out.println(Arrays.toString(parseXYCoord("d 3")));
它打印

[4, 3]
[4, 3]
[4, 3]
[4, 3]
[4, 3]

首先让我们考虑一个主格式。我们希望将所有这些转换为的格式,以便最终将它们转换为两个整数。让我们用空格分隔两个数字。这是最容易解析的

然后,让我们考虑所有这些模式。例如,第一个输入必须只有一个括号,这样我们就可以很容易地识别出来。第三个是guarrenteed,需要包含逗号,但不包含括号。所以,我们可以用一个规则来分组,如果有逗号,去掉括号(如果有),并用空格替换逗号

还剩三个,还剩两个

现在,最后两个有什么共同点?他们共用一封信。我们可以很容易地用正则表达式捕捉到这封信,但让我们稍后再担心。那么,让我们制定一个逻辑规则

如果这个短语没有逗号, 我们检查它是否有一封信。如果有,我们检查它是否有空间。 如果是这样,我们按空格分割,并用其整数等距替换字符,正确偏移以表示其在字母表中的位置。 否则,我们使用正则表达式按字母拆分,并执行上述操作

现在,我们在脑海中有了一个清晰的形象,我们想完成什么,让我们自己去做吧

这就是我在代码中所做的

  public int[] parseXYCoord(String s) {
    String master=s;
    if(s.contains(",")){
        master=master.replace("(","").replace(")","");
        master=master.replace(","," ");
    }else if(master.matches("^[a-z]((\\s[0-8])|[0-8])$")){
        int charValue=master.charAt(0)-'a'+1;
        master=charValue+" "+master.charAt(master.contains(" ")?2:1);


    }
    return parseMaster(master);
}

private int[] parseMaster(String master) {
    if(!master.matches("^[0-8] [0-8]$"))
        throw new IllegalArgumentException("Inputted Number is incorrect!");
    String[] splitMaster=master.split(" ");
    return new int[]{Integer.parseInt(splitMaster[0]),Integer.parseInt(splitMaster[1])};

}
我不太擅长正则表达式。虽然它很难看,但它确实完成了任务。如果你想学习如何使用正则表达式,请访问该网站

使用

    System.out.println(Arrays.toString(parseXYCoord("4,3")));
    System.out.println(Arrays.toString(parseXYCoord("4 3")));
    System.out.println(Arrays.toString(parseXYCoord("(4,3)")));
    System.out.println(Arrays.toString(parseXYCoord("d3")));
    System.out.println(Arrays.toString(parseXYCoord("d 3")));
它打印

[4, 3]
[4, 3]
[4, 3]
[4, 3]
[4, 3]

您可以按以下步骤执行此操作:

  • 删除所有非数字或字母的字符,将以2个字符结尾
  • 看看这两个:
    • 如果数字:解析为
      int
    • 如果没有,请删除字符代码
      'a'
      并添加
      +1
      ,以获得a=1,b=2
版本为

private static int[] parseToCoordStream(String s) {
    return Stream.of(s.replaceAll("[^\\w\\d]", "").toLowerCase().split(""))
            .mapToInt(val -> val.matches("\\d") ? Integer.parseInt(val) : val.charAt(0) - 'a' + 1)
            .toArray();
}

使用


您可以按以下步骤执行此操作:

  • 删除所有非数字或字母的字符,将以2个字符结尾
  • 看看这两个:
    • 如果数字:解析为
      int
    • 如果没有,请删除字符代码
      'a'
      并添加
      +1
      ,以获得a=1,b=2
版本为

private static int[] parseToCoordStream(String s) {
    return Stream.of(s.replaceAll("[^\\w\\d]", "").toLowerCase().split(""))
            .mapToInt(val -> val.matches("\\d") ? Integer.parseInt(val) : val.charAt(0) - 'a' + 1)
            .toArray();
}

使用


这是一个如何实现解决方案的示例。输入被验证,程序抛出相应的异常。我认为该代码的某些或大部分方面可以用于实现解决方案

程序在命令提示符下运行,例如:

> java CoordinateParser "d 7"

示例代码

import java.util.*;

public class CoordinateParser {

    private static final Map<Character, Integer> charIntMap = new HashMap<>();
    static {
        charIntMap.put('a', 0);
        charIntMap.put('b', 1);
        charIntMap.put('c', 2);
        charIntMap.put('d', 3);
        charIntMap.put('e', 4);
        charIntMap.put('f', 5);
        charIntMap.put('g', 6);
        charIntMap.put('h', 7);
        charIntMap.put('i', 8);
    }

    public static void main (String [] args) {

        if (args.length != 1) {
            System.out.println("Program needs input string argument, for example:");
            System.out.println("java CoordinateParser \"d7\"");
            System.out.println("Exiting the program.");
            System.exit(0);
        }

        System.out.println("Input: " + args[0]);

        XYCoordinates xy = new CoordinateParser().getCoordinates(args[0]);
        System.out.println("Co-ordinates: " + xy);
    }

    private XYCoordinates getCoordinates(String input)
            throws NumberFormatException {

        input = input.trim();

        if (input.length() < 2 || input.length() > 5) {
            throw new IllegalArgumentException("Invalid input string length: " + input);
        }

        if (input.length() == 5 && input.startsWith("(") && input.endsWith(")")) {
            return new XYCoordinates(input.substring(1, 2), input.substring(3, 4));
        }

        if (input.length() == 3 && input.contains(",")) {
            return new XYCoordinates(input.substring(0, 1), input.substring(2, 3));
        }       

        if (input.length() == 3 && input.contains(" ")) {
            String x = input.substring(0, 1);
            Integer i = charIntMap.get(x.charAt(0));
            if (i != null) {
                return new XYCoordinates(Integer.toString(i), input.substring(2, 3));
            }
        }           

        if (input.length() == 2) {
            String x = input.substring(0, 1);
            Integer i = charIntMap.get(x.charAt(0));
            if (i != null) {
                return new XYCoordinates(Integer.toString(i), input.substring(1, 2));
            }
        }

        throw new IllegalArgumentException("Invalid input format: " + input);
    }

    /*
     * Inner class represents x and y co-ordinates.
     */
    private class XYCoordinates {

        private int x;
        private int y;

        XYCoordinates(String xStr, String yStr) 
                throws NumberFormatException {

            try {
                x = Integer.parseInt(xStr);
                y = Integer.parseInt(yStr);
            }
            catch (NumberFormatException ex) {
                throw new NumberFormatException("Invalid co-ordinates: " +
                    new StringJoiner(", ", "(", ")")
                        .add(xStr).add(yStr).toString());
            }

            if (isNotValidValue(x) || isNotValidValue(y)) {
                throw new IllegalArgumentException("Co-ordinates out of range: " + toString());
            }
        }

        private boolean isNotValidValue(int i) {
            return (i < 0 || i > 8);
        }

        int getX() {
            return x;
        }

        int getY() {
            return y;
        }

        @Override
        public String toString() {
            return new StringJoiner(", ", "(", ")")
                .add(Integer.toString(x))
                .add(Integer.toString(y))
                .toString();
        }
    }
}
import java.util.*;
公共类协调器{
私有静态最终映射charIntMap=newhashmap();
静止的{
战车地图放置('a',0);
战车地图放置('b',1);
战车地图。放置('c',2);
战车地图。放置('d',3);
战车地图。放置('e',4);
战车地图。放置('f',5);
战车地图。放置('g',6);
战车地图。放置('h',7);
战车地图。放置('i',8);
}
公共静态void main(字符串[]args){
如果(args.length!=1){
println(“程序需要输入字符串参数,例如:”);
println(“java CoordinateParser \“d7\”);
System.out.println(“退出程序”);
系统出口(0);
}
System.out.println(“输入:+args[0]);
XYC