作为一名新手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开头的行,对应于“访问次数”行中的整数。我想通过解析 仅在具有多于1次访问次数的PointNumbers的每个访问实例之后文件并打印Lat,Lon和两个值。
我不确定是从扫描仪还是标记器开始,还是编译模式。哪种技术使得只存储有效的PointNumber更容易? Intuition告诉我解析文件,将相关值放入对象中:
PointNumber num1 = new PointNumber(lat, lon, accesses[]);
然后循环访问对象并打印对象的值,如果访问数组长度是> 1.另一方面,最好忽视不符合要求的信息。这可以通过在解析时检查NumberOfAccesses值来完成,然后跳转到下一个string.startsWith(“PointNumber:”),如果值是< = 1?
我有一种感觉,这个社区的绝大多数都会尝试引导我走向XML或YAML,但我真的更喜欢尝试 用Java解决这个问题。任何建议,方向或适用的例子总是非常感谢。
答案 0 :(得分: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”列表中,然后打印或执行任何操作。