2013-09-22 179 views
0

我想從文件中讀取數據,然後先打印偶數行,然後是奇數行。是最好的讀取行,並將它們存儲在一個列表中,甚至是奇數,然後再打印每一行?還是有更有效的方法呢?從文件中打印偶數行和奇數行

下面的代碼片段,是我在做這種排序的方法......截至目前,它只是將輸入存儲到列表中並打印出來。是否有一種有效的方法來打印偶數行,然後是奇數行?

public static void test(BufferedReader r, PrintWriter w) throws IOException { 

    ArrayList<String> s = new ArrayList<String>(); 

    String line; 
    int n = 0; 
    while ((line = r.readLine()) != null) { 
     s.add(line); 
     n++; 
    } 
    Iterator<String> i = s.iterator(); 
    while (i.hasNext()) { 
     w.println(i.next()); 
    } 
} 

預先感謝任何幫助/輸入!

回答

1

好,最好的辦法是在您閱讀打印的偶數行,並存儲奇數行以便遲後打印。

ArrayList<String> s = new ArrayList<String>(); 

String line; 
int n = 0; 
while ((line = r.readLine()) != null) { 
    if(n % 2 == 0){ 
     s.add(line); 
    } 
    else{ 
     w.println(line); 
    } 
    n++; 
} 
Iterator<String> i = s.iterator(); 
while (i.hasNext()) { 
    w.println(i.next()); 
} 

這會佔用一半的空間。另一個選擇可能是將奇數行打印爲字符串,然後將該值打印到輸出流 - 對於較短的輸入可能效率更高

+0

會首先打印奇數嗎?如果是這樣,那麼if/else是否可以交換,以便首先打印偶數行? – choloboy

+1

這取決於你所說的「奇數」是什麼意思,它會將第0行加到數組中,然後打印第1行,就實際文件而言,它表示存儲奇數行並打印偶數行。只是發生了,我們從索引0開始,而不是1.但是,交換if條件(或者執行%2 == 1)會產生相反的效果。 –

+0

甚至會是第0行,第2行等。而奇數行是1,3 .. – choloboy

1

你可以改變你的循環如下:

while (i.hasNext()) { 
    String odd = i.next(); 
    if (i.hasNext()) { 
     String even = i.next(); 
     w.println(even); 
     w.println(odd); 
    } else { 
     w.println(odd); 
    } 
} 
1

對於小文件,您所做的很好 - 只需遍歷列表兩次打印備用線,第一次傳球,第二次傳球。

對於大文件,請讀取文件兩次並像以前一樣打印備用行。什麼是大文件?這取決於系統。