1

初心者の Java プログラマーとして、個人的なプロジェクトのデータを分析しようとしているときに、かなり高いハードルに遭遇しました。次の形式の約 33.5k データ ポイントを含むテキスト ファイルがあります。

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 で始まる行は、Number of Accesses 行の整数に対応します。ファイルを解析し、Lat、Lon、およびアクセス回数が 1 を超える PointNumbers のみの各アクセス インスタンスに続く 2 つの値を出力したいと思います。

スキャナーまたはトークナイザーから始めるか、パターンをコンパイルするかはわかりません。有効な PointNumbers のみを保存しやすくする手法はどれですか? 直感的に、ファイルを解析して、関連する値をオブジェクトに配置するように指示されます。

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

アクセス配列の長さが 1 より大きい場合は、オブジェクトをループ処理してオブジェクトの値を出力します。一方、要件を満たさない情報は無視することをお勧めします。これは、解析中に NumberOfAccesses 値をチェックし、値が <= 1 の場合は次の string.startsWith("PointNumber:") にジャンプすることで実行できますか?

このコミュニティの圧倒的多数が、私を XML や YAML に向かわせようとするだろうと感じていますが、私は Java でこれに取り組むことを本当に好んでいます。アドバイス、指示、または適用例は常に大歓迎です。

4

1 に答える 1

0

解析する入力がある間、これをループできます

// 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」のリストに追加し、そこから印刷または実行できます。

于 2011-03-02T00:29:57.800 に答える