为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2021-10-28 14:14:57
我目前正在尝试从 TSP 文件中读取坐标,它们通常看起来像这样:NAME: berlin52TYPE: TSPCOMMENT: 52 locations in Berlin (Groetschel)DIMENSION: 52EDGE_WEIGHT_TYPE: EUC_2DNODE_COORD_SECTION1 565.0 575.02 25.0 185.03 345.0 750.04 945.0 685.05 845.0 655.06 880.0 660.07 25.0 230.08 525.0 1000.09 580.0 1175.010 650.0 1130.011 1605.0 620.0 12 1220.0 580.013 1465.0 200.014 1530.0 5.015 845.0 680.016 725.0 370.017 145.0 665.018 415.0 635.019 510.0 875.0  20 560.0 365.021 300.0 465.022 520.0 585.023 480.0 415.024 835.0 625.025 975.0 580.026 1215.0 245.027 1320.0 315.028 1250.0 400.029 660.0 180.030 410.0 250.031 420.0 555.032 575.0 665.033 1150.0 1160.034 700.0 580.035 685.0 595.036 685.0 610.037 770.0 610.038 795.0 645.039 720.0 635.040 760.0 650.041 475.0 960.042 95.0 260.043 875.0 920.044 700.0 500.045 555.0 815.046 830.0 485.047 1170.0 65.048 830.0 610.049 605.0 625.050 595.0 360.051 1340.0 725.052 1740.0 245.0EOF我想要做的是读取所有节点,它们的两个坐标并从中创建一个节点。我想将它们存储在一个 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();}这并没有使我想要它做的事情,但我不明白如何实现它,我想它可以只是将坐标复制到文本文件,但我希望它适用于各种 TSPS。提前致谢!
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

在这里做了一些改变。我读到“NODE_COORD_SECION”然后开始解析存储行的ans。我不是在“”上拆分,而是在“”上拆分并存储值。


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


查看完整回答
反对 回复 2021-10-28
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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

当您到达标有“EOF”的行时,停止读取和存储在您的数组中。

你有多关心 TSP 文件的标题?如果要存储此信息并根据文件中的数据检查它是否正确,而不是仅运行到“NODE_COORD_SECTION”行,则需要查找行:“DIMENSION”并将值存储为 int。然后根据您的 ArrayList“存储”中的最终总数检查此值


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信