拆分字符串以获取坐标/点

tkqqtvp1  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(432)

我使用以下代码来分割 (<x-coordinate>,<y-coordinate>) :

  1. String startPointStr = InputPattern.parsePoint(args.get(0));
  2. String[] startCoords = startPointStr.substring(1, startPointStr.length() - 1).split(",");
  3. Point startPoint = new Point(Integer.parseInt(startCoords[0]), Integer.parseInt(startCoords[1]));

现在,我想修改代码,使它也适用于 (<x-coordinate>,<y-coordinate>),(<x-coordinate>,<y-coordinate>) . 最后我需要两个点,每个点有两个值。
如何做到这一点?

g6baxovj

g6baxovj1#

再看一看,一个有效的解决方案就像这里的代码示例,它只会忽略不是一系列数字的所有值。

  1. Pattern p = Pattern.compile("\\d+");
  2. Matcher m = p.matcher("(100,200),(300,400)");
  3. ArrayList<Integer> values = new ArrayList<>();
  4. while(m.find())
  5. values.add(Integer.parseInt(m.group()));
  6. ArrayList<Point> points = new ArrayList<>();
  7. if(values.size() % 2 == 0)
  8. for(int i = 0; i < values.size(); i += 2)
  9. points.add(new Point(values.get(i), values.get(i + 1)));
  10. for(Point point : points)
  11. System.out.println(point.x + ", " + point.y);

但是,如果效率不是您所担心的问题,那么多重分割解决方案就足以满足您的需要。

展开查看全部
wkyowqbh

wkyowqbh2#

如果您使用的是java>=9,那么可以使用matcher上的results()方法来获取matchresult流并生成点对象列表:

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

结果:
点:[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法中采用分割法得到x、y坐标,生成点目标。

展开查看全部

相关问题