Разделить строку, чтобы получить координаты / точки - PullRequest
0 голосов
/ 14 февраля 2020

Я использую следующий код для разделения (<x-coordinate>,<y-coordinate>):

String startPointStr = InputPattern.parsePoint(args.get(0));

String[] startCoords = startPointStr.substring(1, startPointStr.length() - 1).split(",");
Point startPoint = new Point(Integer.parseInt(startCoords[0]), Integer.parseInt(startCoords[1]));

Теперь я хочу изменить код, чтобы он также работал для (<x-coordinate>,<y-coordinate>),(<x-coordinate>,<y-coordinate>). В конце мне нужны две точки с двумя значениями в каждой.

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Если вы используете Java> = 9, вы можете использовать метод results () в Matcher, чтобы получить поток MatchResult и создать список объектов Point:

    String input = "(1,2),(3,4),(5,6),(500,600),(1000,2000)";
    Pattern cp = Pattern.compile("(\\d+(?=,),(?<=,)\\d+)");
    Matcher matcher = cp.matcher(input);
    List<Point> points = matcher.results()
                            .map(coordinate -> {
                                String xy = coordinate.group();
                                int x = Integer.parseInt(xy.split(",")[0]);
                                int y = Integer.parseInt(xy.split(",")[1]);
                                return new Point(x, y);
                            })
                            .collect(Collectors.toList());
    System.out.println("points: " + points);

Result:

баллов: [java .awt.Point [x = 1, y = 2], java .awt.Point [x = 3, y = 4], java .awt .Point [x = 5, y = 6], java .awt.Point [x = 500, y = 600], java .awt.Point [x = 1000, y = 2000]]

Шаблон регулярного выражения получает координаты без скобок. Затем в методе map используется метод split, чтобы получить координаты x и y и создать объект Point.

1 голос
/ 14 февраля 2020

Посмотрите еще немного, и эффективное решение будет похоже на пример кода здесь , который будет просто игнорировать все значения, которые не являются последовательностью чисел.

    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher("(100,200),(300,400)");

    ArrayList<Integer> values = new ArrayList<>();
    while(m.find())
        values.add(Integer.parseInt(m.group()));

    ArrayList<Point> points = new ArrayList<>();
    if(values.size() % 2 == 0)
        for(int i = 0; i < values.size(); i += 2)
            points.add(new Point(values.get(i), values.get(i + 1)));

    for(Point point : points)
        System.out.println(point.x + ", " + point.y);

Но Решение для множественного разделения будет работать достаточно хорошо для ваших целей, если эффективность не является проблемой, о которой вы беспокоитесь.

...