Разбор массивов различного размера в структуре данных - Java - PullRequest
1 голос
/ 02 марта 2011

Как начинающий Java-программист, я столкнулся с довольно серьезным препятствием при попытке проанализировать данные для моего личного проекта.У меня есть текстовый файл с ~ 33,5 тыс. Точек данных в следующем формате:

PointNumber:        33530  
Lat:                8.99167773897820e-001  
Lon:                6.20173660875318e+000  
Alt:                0.00000000000000e+000  
NumberOfAccesses:   4  
0    4.80784667215499e+003   4.80872732950073e+003  
0    1.05264215520092e+004   1.05273043378212e+004  
1    1.65167780853593e+004   1.65185840063538e+004  
1    6.52228387069902e+004   6.52246514228552e+004  

Последние строки, то есть строки, начинающиеся с 0 или 1, соответствуют целому числу в строке «Количество доступов».Я хотел бы проанализировать файл и распечатать Lat, Lon и два значения, следующие за каждым экземпляром доступа только PointNumbers с более чем 1 числом обращений.

Я не уверен, стоит ли начинать со сканера или токенизатора или скомпилировать шаблон.Какой метод облегчает хранение только действительных номеров PointNumbers?Интуиция подсказывает мне разобрать файл, поместив соответствующие значения в объект:

PointNumber num1 = new PointNumber(lat, lon, accesses[]);

Затем переберите объекты и напечатайте значения объекта, если длина массива доступа> 1. С другой стороны, онбыло бы лучше игнорировать информацию, которая не соответствует требованиям.Можно ли это сделать, проверив значение NumberOfAccesses при разборе, а затем перейти к следующему значению string.startsWith ("PointNumber:"), если значение равно <= 1?</p>

У меня такое чувство, что подавляющее большинство этого сообщества попытается направить меня в сторону XML или YAML, но я действительно предпочитаю пытаться решить эту проблему на Java.Любые советы, указания или применимые примеры всегда приветствуются.

1 Ответ

0 голосов
/ 02 марта 2011

Вы можете пройти через это, пока у вас есть ввод для анализа

// Assuming you have a scanner object named s and pointed to your file:

// PointNumber: 33530
int pointNumber = 0;
while(!s.next().equals("PointNumber:")) {
    pointNumber = s.nextInt();
}

// Lat: 8.99167773897820e-001
double lat = 0.0;
while(!s.next().equals("Lat:")) {
    lat = s.nextDouble();
}

// Lon: 6.20173660875318e+000
double lon = 0.0;
while(!s.next().equals("Lon:")) {
    lon = s.nextDouble();
}

// Alt: 0.00000000000000e+000
double alt = 0.0;
while(!s.next().equals("Alt:")) {
    alt = s.nextDouble();
}

// NumberOfAccesses: 4
int numberOfAccesses = 0;
while(!s.next().equals("NumberOfAccesses:")) {
    numberOfAccesses = s.nextInt();
}

// 0 4.80784667215499e+003 4.80872732950073e+003
// 0 1.05264215520092e+004 1.05273043378212e+004
// 1 1.65167780853593e+004 1.65185840063538e+004
// 1 6.52228387069902e+004 6.52246514228552e+004

// Assuming you have defined an Access class
LinkedList<Access> accesses = new LinkedList<Access>();
for(int i = 0; i < numberOfAccesses; i++) {
    // Assuming this is the constructor for the Access class
    accesses.add(new Access(s.nextInt(), s.nextDouble(), s.nextDouble()));
}

Затем вы можете добавить все данные, которые вам действительно нужны, в список «PointNumber», а затем распечатать или сделать что-нибудь из него.

...