affine  2
 0.62367 -0.40337   0.40337  0.62367 0.00 0.00 0.75
-0.37633 -0.40337   0.40337 -0.37633 1.00 0.00 0.25
scale 500
height 690
width 410
xOffset 134
yOffset 112
name Golden Dragon


从这个文本文件中,我想提取一个名为affine的数组,其宽度为2。
接下来的两行中用空格分隔的以下值是数组内部的值。

我已经能够从文本文件中读取其他变量,但似乎无法弄清楚数组。

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

 public FileIfs(File path){

         try (BufferedReader ifsReader = new BufferedReader(new FileReader(path))) {
            String line = null;
            int i = 0; int j = 0;

             while((line = ifsReader.readLine()) != null) {
                if (line.startsWith("name")) {
                    name = line.substring(4).trim();
                    System.out.println("Name: " + name);
                 }
                 if (line.startsWith("scale")) {
                    scale = Double.parseDouble(line.substring(5).trim());
                    System.out.println("Scale: " + scale);
                 }
                 if (line.startsWith("height")) {
                    height = Integer.parseInt(line.substring(6).trim());
                    System.out.println("Height: " + height);
                 }
                 if (line.startsWith("width")) {
                    width = Integer.parseInt(line.substring(5).trim());
                    System.out.println("Width: " + width);
                 }
                 if (line.startsWith("xOffset")) {
                    xOffset = Integer.parseInt(line.substring(7).trim());
                    System.out.println("xOffset: " + xOffset);
                 }
                 if (line.startsWith("yOffset")) {
                    yOffset = Integer.parseInt(line.substring(7).trim());
                    System.out.println("yOffset: " + yOffset);
                 }
                 if (line.startsWith("affine")) {
                    int arrLeng = Integer.parseInt(line.substring(6).trim());
                    System.out.println("Array Length: " + arrLeng);

                    affine = new double[arrLeng][7];
                 }
                 else {
                    if (line.startsWith(" ")) {
                        line.trim();
                    }

                    String currentLine [] = line.split("\\s+");

                    if (!line.trim().isEmpty()){
                        for (String s : currentLine) {
                            if (!s.trim().isEmpty()) {
                                affine[i][j++] = Double.parseDouble(s);
                            }
                        }
                        line = ifsReader.readLine();
                        i++;
                        j = 0;
                    }

                 } //end of ifelse
             } //loop through every line of file
             ifsReader.close();
         }
         catch (Exception e) {
             System.out.println("could not find file");
         }  //end of try-catch
    }


else部分中的代码是我尝试读取数组的地方。

如果有人可以帮忙,或者向我指出正确的方向,那将是很棒的。

谢谢。

最佳答案

一个可能的解决方案。它使用列表来保留数组数据。如果需要,将列表转换为真实数组很容易。

public void fileIfs(Path path) throws IOException {
    try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {

        // ------- read parameters -------

        Pattern paramPattern = Pattern.compile("([A-Za-z]+)\\s+([\\w\\s]+)");
        Matcher paramMatcher = paramPattern.matcher(lines.collect(Collectors.joining(",")));
        Map<String, String> params = new HashMap<>();

        while (paramMatcher.find()) {
            params.put(paramMatcher.group(1), paramMatcher.group(2));
        }
        String name = params.get("name");
        int affine = Integer.parseInt(params.get("affine"));
        int scale = Integer.parseInt(params.get("scale"));
        int height = Integer.parseInt(params.get("height"));
        int width = Integer.parseInt(params.get("width"));
        int xOffset = Integer.parseInt(params.get("xOffset"));
        int yOffset = Integer.parseInt(params.get("yOffset"));

        // ------- read array -------

        List<List<Double>> affineList = new ArrayList<>();
        Pattern arrayPattern = Pattern.compile("([\\-\\d]+\\.\\d+)");

        lines.forEach(line -> {
            Matcher arrayMatcher = arrayPattern.matcher(line);
            List<Double> numbers = new ArrayList<>();
            while (arrayMatcher.find()) {
                numbers.add(Double.parseDouble(arrayMatcher.group(1)));
            }
            if (!numbers.isEmpty()) {
                affineList.add(numbers);
            }
        });

        // ---------------

        System.out.println("params: " + params);
        System.out.println("affineList: " + affineList);
    }
}


输出:

params: {yOffset=112, xOffset=134, width=410, name=Golden Dragon, scale=500, affine=2, height=690}
affineList: [[0.62367, -0.40337, 0.40337, 0.62367, 0.0, 0.0, 0.75], [-0.37633, -0.40337, 0.40337, -0.37633, 1.0, 0.0, 0.25]]

09-25 16:33