扫描仪出现问题,无法设法读取TSP文件

时间:2018-10-05 10:41:12

标签: java

我目前正在尝试从TSP文件中读取坐标,它们通常看起来像这样:

NAME: berlin52
TYPE: TSP
COMMENT: 52 locations in Berlin (Groetschel)
DIMENSION: 52
EDGE_WEIGHT_TYPE: EUC_2D
NODE_COORD_SECTION
1 565.0 575.0
2 25.0 185.0
3 345.0 750.0
4 945.0 685.0
5 845.0 655.0
6 880.0 660.0
7 25.0 230.0
8 525.0 1000.0
9 580.0 1175.0
10 650.0 1130.0
11 1605.0 620.0 
12 1220.0 580.0
13 1465.0 200.0
14 1530.0 5.0
15 845.0 680.0
16 725.0 370.0
17 145.0 665.0
18 415.0 635.0
19 510.0 875.0  
20 560.0 365.0
21 300.0 465.0
22 520.0 585.0
23 480.0 415.0
24 835.0 625.0
25 975.0 580.0
26 1215.0 245.0
27 1320.0 315.0
28 1250.0 400.0
29 660.0 180.0
30 410.0 250.0
31 420.0 555.0
32 575.0 665.0
33 1150.0 1160.0
34 700.0 580.0
35 685.0 595.0
36 685.0 610.0
37 770.0 610.0
38 795.0 645.0
39 720.0 635.0
40 760.0 650.0
41 475.0 960.0
42 95.0 260.0
43 875.0 920.0
44 700.0 500.0
45 555.0 815.0
46 830.0 485.0
47 1170.0 65.0
48 830.0 610.0
49 605.0 625.0
50 595.0 360.0
51 1340.0 725.0
52 1740.0 245.0
EOF

我想要做的是读取所有节点,它们的两个坐标并由此创建一个节点。我想将它们存储在存储列表的arraylist中,例如:

ArrayList<String[]>

我的代码当前看起来像这样:

package group12.TSP.tree;
import java.io.File;
import java.util.*;

public class Tree {
    ArrayList<String[]> storing = new ArrayList<String[]>();

    public Tree() throws Exception{
    File file = new File("C:/Users/joaki/Desktop/burma14.tsp");
    Scanner sc = new Scanner(file);
    storing = new ArrayList<String[]>();
    String nextValue = null;
    //sc.reset();
    sc.useDelimiter("  ");
    while (sc.hasNextLine()) {
        sc.nextLine();
        while(sc.hasNextDouble()) {
            nextValue = sc.nextLine();
            //st.replaceAll("\\s+","")
            //nextValue = nextValue.replace(" ", "");
            storing.add(nextValue.split(""));   
            continue;
        }

    }
    sc.close();
}

public static ArrayList<String[]> returnScanner() throws Exception {
    Tree tree = new Tree();
    return tree.storing;
}
public static void main(String[] args) throws Exception{
    ArrayList<String[]> storedValues = returnScanner();
    String[] firstLine = storedValues.get(0);
    String[] secondLine = storedValues.get(1);
    for(int i = 0; i < firstLine.length; i++) {
        System.out.println(firstLine[i]);
    }
}
}

这不能满足我的要求,但是我不知道如何实现,我想它可以将坐标复制到文本文件中,但是我希望它可以用于各种TSPS。预先感谢!

2 个答案:

答案 0 :(得分:1)

使用扫描仪移动到下一行,直到遇到短语“ NODE_COORD_SECTION”。接下来的几行就是您的数据行。它们都符合格式,因此您可以使用split获得第二个和第三个元素。

到达一行显示“ EOF”的行时,停止读取并存储在阵列中。

您在乎TSP文件的标题吗?如果要存储此信息并检查文件中的数据是否正确,而不仅仅是运行“ NODE_COORD_SECTION”行,则需要查找“ DIMENSION”行并将该值存储为int。然后对照您的ArrayList“ storing”中的最终总数检查此值

答案 1 :(得分:1)

在这里做了一些更改。我读到“ NODE_COORD_SECION”,然后开始解析并存储行。我没有拆分“”,而是拆分了“”并存储值。

public class Tree {
    ArrayList<String[]> storing;

    public Tree() throws Exception {
        File file = new File("C:/Users/joaki/Desktop/burma14.tsp");
        Scanner sc = new Scanner(file);
        storing = new ArrayList<String[]>();
        String nextValue = null;
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            if("NODE_COORD_SECTION".equals(line)){
                while (sc.hasNextLine()) {
                    nextValue = sc.nextLine();
                    storing.add(nextValue.trim().split(" "));
                }
            }
        }
        sc.close();
    }

    public static ArrayList<String[]> returnScanner() throws Exception {
        Tree tree = new Tree();
        return tree.storing;
    }

    public static void main(String[] args) throws Exception {
        ArrayList<String[]> storedValues = returnScanner();
        String[] firstLine = storedValues.get(0);
        String[] secondLine = storedValues.get(1);
        for (int i = 0; i < firstLine.length; i++) {
            System.out.println(firstLine[i]);
        }
    }
}

我的输出:

1
565.0
575.0