1

我在读取多组值时遇到问题,这些值将保存为 x,y 坐标,然后存储为节点。我正在用 Java 编写这个程序。文本文件中的一些输入行如下所示:

(220 616) (220 666) (251 670) (272 647) # Poly 1

(341 655) (359 667) (374 651) (366 577) # Poly 2

(311 530) (311 559) (339 578) (361 560) (361 528) (336 516) # Poly 3

我需要读取每个坐标并将它们存储为节点(x,y)格式的节点。实现这一目标的最佳方法是什么?到目前为止,我正在使用一个扫描仪,它在有下一行时读取输入文件。我将该行保存在字符串 s 中,并尝试像这样解析它

while (scanner.hasNextLine()) {
   String s = nextLine();

   //parse code goes here
   //Currently this is what I have, but I think I'm going about it in a weird way
   String newS = s.substring(s.indexOf("(" + 1, s.indexOf(")"));
   String newX = newS.substring(0, newS.indexOf(" "));
   String newY = newS.substring(newS.indexOf(" ") + 1);
   int x = Integer.parseInt(newX);
   int y = Integer.parseInt(newY);
}

我已经阅读了分隔符上方的几篇文章,但我仍然有点迷茫。本质上,我需要能够遍历并将每个 x,y 坐标保存为一个节点,然后将其存储在一个数组中。

任何帮助都有帮助!谢谢!

4

2 回答 2

1

一种可能的解决方案是对字符串使用 .split() 方法。假设您所有的行都以相同的方式格式化

String s ="(220 616) (220 666) (251 670) (272 647)";
String[] arr = s.split("\\)\\s*");

每次遇到右括号“ \\) ”时都会创建一个新数组条目,后跟任意长度的空格“ \\s* ”

1:“(220 616”

2:“(220 666”

3:“(251 670”

4:“(272 647”

然后可能使用 substring() 来挑选你需要的数字,把它变成一个点,然后把它添加到一个点的数组列表中。

例如。

    String s ="(220 616) (220 666) (251 670) (272 647)";
    String[] arr = s.split("\\)\\s*");
    List<Point> points = new ArrayList<Point>();
    for (String anArr : arr){
        int x = Integer.parseInt(anArr.substring(1,anArr.indexOf(" ")));
        int y = Integer.parseInt(anArr.substring(anArr.indexOf(" ") + 1, anArr.length()));
        Point p = new Point(x,y);
        points.add(p);
        System.out.println(p);
    }

给出输出

    java.awt.Point[x=220,y=616]
    java.awt.Point[x=220,y=666]
    java.awt.Point[x=251,y=670]
    java.awt.Point[x=272,y=647]
于 2013-09-16T03:45:08.297 回答
1

您可以使用正则表达式来隔离坐标

    while (scanner.hasNextLine()) {   
       String currentLine = scanner.nextLine();
       Pattern myPattern = Pattern.compile("[0-9][0-9][0-9] [0-9][0-9][0-9]");
       Matcher myMatcher = myPattern.matcher(currentLine);

       while (myMatcher.find()) {
           String[] coordinatesSplit = myMatcher.group().split(" ");
           int x = Integer.parseInt(coordinatesSplit[0]);
           int y = Integer.parseInt(coordinatesSplit[1]);
       }
    }
于 2013-09-16T04:43:33.857 回答