我有一个非常大的文本文件,如下所示:
0 239.0 -13.0 0
1 240.0 -13.0 33
2 241.0 -13.0 34
3 242.0 -13.0 44
4 243.0 -13.0 45
5 244.0 -13.0 74
6 245.0 -13.0 74
7 246.0 -13.0 79
8 247.0 -13.0 79
9 248.0 -13.0 113
10 249.0 -13.0 113
11 250.0 -13.0 120
12 251.0 -13.0 120
13 252.0 -13.0 153
14 253.0 -13.0 153
15 254.0 -13.0 160
16 255.0 -13.0 160
17 256.0 -13.0 194
18 257.0 -13.0 195
19 258.0 -13.0 199
20 259.0 -13.0 200
21 260.0 -13.0 232
22 261.0 -13.0 232
23 262.0 -13.0 239
...
...
每行的最后一个条目是timestamp
。
现在我想实现一个名为read(int timestamp, int range)
的方法,它以有效的方式从这个文本文件中返回一系列行。
例如,如果我调用read(10250,100)
,我想寻找时间戳为10250的行(如果存在这样的行,否则最接近下一行)并返回100行之前时间戳行,该行使用timstamp本身,并在字符串数组中的时间行后100行。
以下是我read(int timestamp, int range)
的当前实现:
public static void read(int timestamp,int range) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
String line;
int currTimestamp;
while ((line = br.readLine()) != null) {
currTimestamp = Integer.parseInt(line.split("\\s+")[3]);
if (currTimestamp >= timestamp) {
for(int i = 0; i<range;i++){
System.out.println(br.readLine());
}
break;
}
}
br.close();
}
问题是此实现仅在时间戳后打印出100行。我以前不知道如何包含100行。因为我不知道时间戳行在哪一行,我需要以某种方式阅读&#34; 向后&#34;以前获得100行。 如何以有效的方式实现这一点? 亲切的问候
答案 0 :(得分:1)
我会使用固定大小range
的{{3}},例如100.引用其添加方法:
将给定元素添加到此队列。如果队列已满,则最近添加的元素将被丢弃,以便可以插入新元素。
这样,你只保留在内存range
行,而不是所有以前的行。
您可以从CircularFifoQueue下载jar。
它还提供了一个get(int index)
方法,您可以使用它按照您希望的顺序打印行,但我认为您不需要它,因为迭代器按插入顺序返回元素。所以,这是我的建议:
public static void read(int timestamp,int range) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
String line;
CircularFifoQueue<String> prevLines = new CircularFifoQueue<>(range);
int currTimestamp;
while ((line = br.readLine()) != null) {
currTimestamp = Integer.parseInt(line.split("\\s+")[3]);
if (currTimestamp >= timestamp) {
for (String prevLine : prevLines) { //prints the range previous lines
System.out.println(prevLine);
}
System.out.println(line); //prints the current line
for(int i = 0; i<range;i++){ //prints the following range lines
System.out.println(br.readLine());
}
break;
} else {
prevLines.add(line);
}
}
br.close();
}
答案 1 :(得分:0)
尝试:
public static void read(int timeStamp,int range) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("LOG_TEST"));
String line;
ArrayList<String> save=new ArrayList<String>();
int currTimestamp;
String str:
while ((line = br.readLine()) != null) {
timestamp = Integer.parseInt(line.split("\\s+")[3]);
save.add(br.readLine());
int i=save.length-100;
if (currTimestamp >= timestamp) {
//logic for print 100 line from array save
...
for(int i = 0; i<range;i++){
System.out.println(br.readLine());
}
break;
}
}
br.close();
}