Java:将多个用户输入坐标添加到列表中



我正在编写一个Java程序来获取用户输入的坐标,例如:

((1 2),(3 4))

并将其放入坐标列表中。因此,例如,如果我输入((3 2))我会去掉所有括号并将字符串拆分为逗号,以便将两个坐标放入 ArrayList 中,如下所示:

[1 2, 3 4]

如果我有一个坐标(即 ((1 2)) (,但是我将如何拆分字符串并将每个唯一坐标作为自己的条目放入 ArrayList?

这是我到目前为止的代码:

    public static String getParenthesesContent(String str){
        String answer = str.substring(str.indexOf("((")+2,str.indexOf(")"));
        return answer;
    }
    public static void main(String[] args) {
        List<String> points = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        System.out.println("Enter coordinates: ");
        String blocks = in.nextLine();
        System.out.println(blocks);
        String answer = getParenthesesContent(blocks);
        System.out.println(answer);
        points.add(answer);
   }

您应该考虑使用一种更简单、更好的方法来定义输入,以便更好/更快/更轻松地处理该输入(看起来您正在用这种输入格式射击自己的脚(

对问题...您可以使用类似 \((.+?)\) 的模式定义 REGEX。并清理每场比赛,然后将其放入列表中。

public static void main(final String[] args) {
    List<String> points = new ArrayList<>();
    System.out.println("Enter coordinates: ");
    String blocks = "((1 2),(3 4))";
    foo(blocks, points);
    blocks = "( 1 2)"; //intentionally added space to the input
    foo(blocks, points);
    blocks = "((1 2),(3 4),(8 7))";
    foo(blocks, points);
    System.out.println(points);
}
private static void foo(final String blocks, final List<String> points) {
    Matcher match = Pattern.compile("\((.+?)\)").matcher(blocks);
    while (match.find()) {
        String x = match.group(1).replace("(", "").trim();
        System.out.println(x);
        points.add(x);
    }
}

使用 split 方法 split(( 来划分输入,然后去掉括号并添加到列表中。

List<String> points = new ArrayList<>();
    Scanner in = new Scanner(System.in);
    System.out.println("Enter coordinates: ");
    String blocks = in.nextLine();
    System.out.println(blocks);
    String[] vars= blocks.split(",");
     for (int i = 0; i < vars.length; i++) {
        String answer = getParenthesesContent(vars[i]);
        if(!points.contains(answer)) points.add(answer);//prevent repeat
    }
    System.out.println(Arrays.toString(points.toArray()));

输出

[1 2, 3 4]

如果您经常使用这些坐标,您还可以创建一个 Position 类来保存 (x,y( 并将位置对象保存在 ArrayList 中。

public class Position {
    private int x;
    private int y;
    public Position(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() { return x; }
    public int getY() { return y; }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }
}

如果您想扩展 Comparable 以轻松对它们进行排序,或者想要以下方法,可能会很方便:

this.getX();

this.getPosition();

您还可以将位置添加到哈希映射并存储不同对象的位置。

HashMap<Position, Object> hMap = new HashMap<>();
hMap.put(new Position(1,3), player);

最新更新