Java 通过命令行加载线坐标-自定义输入格式

Java 通过命令行加载线坐标-自定义输入格式,java,command-line-arguments,Java,Command Line Arguments,我必须通过命令行加载坐标 坐标的格式如下所示: 0 1 1 1 1 1 2 2 12 12 13 13 3 3 4 4 "0 1 1 1 1 1 2 2 12 12 13 13 3 3 4 4" 第一行坐标为: x1:0 y1:1 x2:1 y2:1 第二行坐标为: x1:1 y1:1 x2:2 y2:2 等等 我尝试了什么? 试图在输入中找到“双空格”,但它似乎只加载数字,因此我无法跟踪用户是否确实通过了线的4x坐标(使用此方法,用户可以通过0 1 0 2

我必须通过命令行加载坐标

坐标的格式如下所示:

0 1 1 1  1 1 2 2  12 12 13 13  3 3 4 4
"0 1 1 1  1 1 2 2  12 12 13 13  3 3 4 4"
第一行坐标为:
x1:0 y1:1
x2:1 y2:1

第二行坐标为:
x1:1 y1:1
x2:2 y2:2
等等

我尝试了什么?

试图在输入中找到“双空格”,但它似乎只加载数字,因此我无法跟踪用户是否确实通过了线的4x坐标(使用此方法,用户可以通过
0 1 0 2 12 13
,它将通过,这是错误的):

我还尝试将所有参数作为一个新列表加载,但刚刚意识到问题与上面相同,我仍然无法正确跟踪用户是否在我的模板中传递数据:

public void begin(String args[]) {
    rawArgs = new ArrayList<>();
    rawArgs.addAll(Arrays.asList(args));
    System.out.println(rawArgs);
}
这样我就可以跟踪用户是否确实通过了单线的4x坐标。我如何跟踪这个双空间

PS.我想用引号将这些数据传递如下:

0 1 1 1  1 1 2 2  12 12 13 13  3 3 4 4
"0 1 1 1  1 1 2 2  12 12 13 13  3 3 4 4"
但我不确定如何正确有效地将字符串转换成数字

展望未来: 我想把这些数据保存为整数数组[4],你认为呢?可以吗

例如:

ArrayList<ArrayList<Integer>> coordinates;
ArrayList坐标;
坐标[0]
将在数组列表中包含
[0,1,1]


我将感谢您的帮助

我将遵循您的第二种方法,这意味着传递一个带有坐标的字符串作为一个参数(在引号中)。使用单个字符串通常比使用多个参数更简单

我首先要做的是检查输入是否与正则表达式匹配,正则表达式通常如下所示:
D

它看起来很简单:

^\d+ \d+ \d+ \d+  \d+ \d+ \d+ \d+  \d+ \d+ \d+ \d+  \d+ \d+ \d+ \d+$
(当然可以缩短一点,但让我们尽量简单)

现在,您不必担心收到的输入是否有效,因此您可以专注于解析它。我的想法是迭代除以空格的字符串,将其转换为整数,然后组合成数组。有四组四个坐标,因此它是一个由四个整数的四个数组列表组成的数组列表

下面是我写的一段代码:

import java.util.ArrayList;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        final String regex = "^\\d+ \\d+ \\d+ \\d+  \\d+ \\d+ \\d+ \\d+  \\d+ \\d+ \\d+ \\d+  \\d+ \\d+ \\d+ \\d+$";
        if(args.length != 1 || !args[0].matches(regex)) {
            System.out.println("Input format should be: \"0 1 1 1  1 1 2 2  12 12 13 13  3 3 4 4\"");
            System.exit(-1);
        }
        var groups = args[0].split("  ");
        ArrayList<ArrayList<Integer>> coordinates = new ArrayList<>();
        for(var group : groups) {
            var arrayOfStrings = group.split(" ");
            var coordinate = new ArrayList<Integer>();
            for(var singleString : arrayOfStrings) {
                coordinate.add(Integer.parseInt(singleString));
            }
            coordinates.add(coordinate);
        }

        //printing coordinates
        for(var singleGroup : coordinates) {
            System.out.println("[" + singleGroup.stream().map(String::valueOf).collect(Collectors.joining(", ")) + "]");
        }
    }
}

发现保留点的最佳方法是使用
HashSet
,因为它可以防止数据的重复,所以我可以从一行插入点
1,1
,从另一行插入点
1,1
,它将合并到一个点
[0, 1, 1, 1]
[1, 1, 1, 2]
[12, 12, 13, 13]
[3, 3, 4, 4]