(Java)如何解析具有多种可能格式的坐标字符串,并将其转换为整数?
我有一个方法,它从用户那里接收(X,Y)坐标字符串。X和Y坐标的范围都在0到8之间,坐标可以是五种可能的格式之一:(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坐标转换为两个独立的整数,并将它们存储在某个位置,而不
- (4,3):括号中的X和Y坐标,用逗号分隔,没有空格
- 4 3:X和Y坐标仅用空格分隔,无括号
- 4,3:X和Y坐标仅用逗号分隔,无括号
- d3:用字母表示的X。0=A,1=B,…,8=H。X和Y之间用空格隔开
- d3:除无空格外,与上述内容相同
我对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'
,以获得a=1,b=2+1
- 如果数字:解析为
流
版本为
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'
,以获得a=1,b=2+1
- 如果数字:解析为
流
版本为
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