Чтение и токенизация файла в Java - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь выяснить, как прочитать некоторые данные о проблеме коммивояжера из файла.Я включил первые несколько строк файла (формат для остальных 13503 строк одинаков, поэтому я их удалил).Файл выглядит так:

    NAME : usa12
    COMMENT : Cities with population at least 500 in 
    TYPE : TSP
    DIMENSION : 13509
    EDGE_WEIGHT_TYPE : EUC_2D
    NODE_COORD_SECTION
    1 245552.778 817827.778
    2 247133.333 810905.556
    3 247205.556 810188.889
    4 249238.889 806280.556
    5 250111.111 805152.778
    6 254475.000 804794.444

Меня интересуют две вещи.Значение измерения и координаты города.Показаны города с номерами 1,..,6 (но их 13509), каждая из их координат x и y смежна.Например, Город 4 имеет x=249238.889 и y=806280.556.По сути, я хотел бы прочитать свой файл и сохранить данные следующим образом:

int dimension = read dimension of 13509
Coordinate[] xy = create coordinates array, with coordinates of each city

Где объект coordinate определен так:

public class Coordinate {
    double x;
    double y;
    public Coordinate(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

Я думаю, мне нужноиспользуйте Buffered Reader, некоторые исключения ввода-вывода и String Tokenizer.Я новичок в этом, поэтому я не совсем уверен, как это реализовать.Я не знаю, как конкретно прочитать значение размера и координаты х и у.У кого-нибудь есть предлагаемые реализации?

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Итак, вот базовый образец. Обновится в случае изменений.

import java.util.*;
import java.io.*;
class SO{
    public static void main(String...a)throws Exception{
        System.out.println("Start");


//Read thing
File f = new File("so_data.txt");

Scanner s = new Scanner(f);

int counts = 0;

s.nextLine();//skip 1
s.nextLine();//skip 2
s.nextLine();//skip 3
counts = Integer.parseInt(s.nextLine().split(" ")[2]);//use 4th
s.nextLine();//skip 5
s.nextLine();//skip 6
System.out.println(counts+" : counts");



counts = 6;//DUMMY DATA FOR TEST FILE - REMOVE FOR ACTUAL FILE

Coordinate[] xy = new Coordinate[counts];


int i = 0;

while(i<counts){ // picking exactly the required number of items.

            String line = s.nextLine();
            String[] vals = line.split(" ");

            double x = Double.parseDouble(vals[1]);
            double y = Double.parseDouble(vals[2]);

            Coordinate c =  new Coordinate(x,y);
//          System.out.println(c);
            xy[i++] = c;
        }


for( i = 0;i<xy.length;i++)
            System.out.println("for index "+i+") "+xy[i]);

    }
}
 class Coordinate {
    double x;
    double y;
    public Coordinate(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public String toString(){
        return "Coord:: "+x+" , "+y;
    }
}

so_data.txt

NAME : usa12
COMMENT : Cities with population at least 500 in 
TYPE : TSP
DIMENSION : 13509
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 245552.778 817827.778
2 247133.333 810905.556
3 247205.556 810188.889
4 249238.889 806280.556
5 250111.111 805152.778
6 254475.000 804794.444
0 голосов
/ 02 мая 2019

Вот фрагмент кода:

  public static void main(String[] args) {
        try {
            File file = new File("input.txt");
            Scanner input = new Scanner(file);
            int dimension = 13509;

            Coordinate[] coordinates = new Coordinate[dimension];
            while (input.hasNext()) {
                coordinates[input.nextInt()-1] = new Coordinate(input.nextDouble(), input.nextDouble());
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Error! file not find");
        }
    }
...