2016-08-25 70 views
-3

我試圖用Java編寫一個函數,返回從一個txt文件的下一個上升序列(運行)獲取下運行,比方說,一個函數的返回值類型是的ArrayList從文本文件

我的示例文件input.txt包含下一個值:78123421.所以就運行而言,這意味着文件有4次運行:| 78 | 1234 | 2 | 1 |。

什麼我想在這裏達成就像是當我稱之爲從main()的四倍這種功能,它應該打印像

1.run: 78, 
2.run: 1234, 
3.run: 2, 
4.run: 1 

或只是兩個電話應打印

1.run: 78, 
2.run: 1234 

我試圖解決我的問題使用BufferedReader/FileReader和RandomAccessFile,但目前爲止沒有工作解決方案,請幫助:/

所以這就是我到目前爲止。主要思想是使用RandomAccessFile並從輸入讀取,只要運行條件滿足。但讀者更多地讀取一個值,這就是爲什麼當下一個函數調用發生時,我使用seek()開始讀取正確位置的原因。代碼中必須存在一個錯誤,因爲它不會打印所有的運行或者只是一個Exception引發。

import java.io.File; 
import java.util.ArrayList; 
import java.io.RandomAccessFile; 

public class GetRunsFromFile 
{ 
    static long start = 0; 
    static long read_len = 0; 

    public static void main(String[] args) throws Exception 
    { 
     File in = new File("C:/Users/henrich/Desktop/Gimp.txt"); 
     RandomAccessFile raf = new RandomAccessFile(in,"r"); 
     ArrayList<Integer> current_run = new ArrayList<Integer>();  

     for(int i=1;i<=4;i++) 
     { 
      current_run = getNextRun(raf);  
      printArrayList(current_run); 
     } 
     raf.close(); 
    } 

    private static ArrayList<Integer> getNextRun(RandomAccessFile raf) throws Exception 
    {  
     int v; 
     String line; 
     int val = Integer.MIN_VALUE;  
     ArrayList<Integer> run = new ArrayList<Integer>();   

     while((line=raf.readLine())!= null) 
     {    
      v = Integer.parseInt(line.trim());    
      if(v >= val) 
      {    
       read_len = raf.getFilePointer() - start;     
       start = raf.getFilePointer(); 
       run.add(v); 
       val = v;      
      } 

      else 
      {   
      raf.seek(raf.getFilePointer() - read_len); 
      start = raf.getFilePointer(); 
      return run;     
      } 
    } 

    return null; 
} 

private static void printArrayList(ArrayList<Integer> al) 
{ 
    for(int i=0; i<al.size(); i++) 
    { 
     System.out.print(al.get(i) + " "); 
    } 
    System.out.println(); 
    System.out.println("------"); 
} 
} 

有關更多問題,請讓我知道。

注意:它只適用於升序運行和任意長度的文件。

感謝您的支持。

+1

這將是最好的顯示代碼,你必須嘗試並找出失敗的原因。 – Makoto

回答

0

有幾種方法可以做到這一點。

溶液1

例如調用函數有一個int並使其返回一個int指的最後一個字符打印的數量。

運行的exaple:

在第一次運行返回2導致打印文本的長度後爲2 第二運行返回6原因後打印文本的長度是4 2從最後一個循環...等

public int function(int startPoint){ 

// do stuff here 

return lastIndexofPrintChar; 
} 

然後調用你的函數類似這樣的

loop{ 
int result=0; 
result= function(x); 
} 

解決方案2

您也可以對您的文件進行共享並刪除您打印的每個字符串。

+0

解決方案2不是這裏的一個選項,但解決方案1可能工作。每次當我調用函數時,是否跳過已打印的元素? – henrich

+0

是的。用一個int'skipChar'來調用函數來跳過多少個字符。在你做了你想要添加的字符串的長度你打印到skipChar並返回它。然後再次調用「returned」skipChar e.tc – gvlachakis

+0

現在就試試,謝謝! – henrich

0
private static void getNextRun() 
{ 
    try 
    { 
     BufferedReader br = new BufferedReader(new FileReader(new File("C:/Users/henrich/Desktop/Gimp.txt"))); 
     br.skip(skip_lines); 

     int v; 
     String line;    
     int val = Integer.MIN_VALUE;   
     ArrayList<Integer> al = new ArrayList<Integer>();   

     while((line=br.readLine())!= null) 
     { 
      skip_lines += line.length()+2; 
      v = Integer.parseInt(line.trim()); 

      if(v >= val) 
      {     
       al.add(v); 
       val = v;  
      } 

      else 
      {     
       skip_lines -= line.length() + 2; 
       printArrayList(al);     
       break; 
      } 
     } 

     br.close(); 
    } 

    catch (Exception e){System.out.println("EOF");}  
}