Get

2016-08-25 4 views
-3

ich eine Funktion in Java zu schreiben versuchen, das die nächste aufsteigend kehrt Sequenz (run) aus einer txt-Datei, sagen sie, der Rückgabetyp einer Funktion Arraylist sei.Get

Meine Beispieldatei input.txt enthält die nächsten Werte: 78123421. Also in Bezug auf Läufe bedeutet das, dass die Datei 4 Läufe hat: | 78 | 1234 | 2 | 1 |.

Was soll ich versuche, hier zu erreichen ist, wie wenn ich diese Funktion aus dem Haupt nennen würde() viermal sollte es so etwas wie

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

oder nur zwei Anrufe gedruckt werden sollen drucken

1.run: 78, 
2.run: 1234 

Ich habe versucht, mein Problem mit BufferedReader/FileReader und RandomAccessFile zu lösen, aber bisher keine funktionierende Lösung, bitte helfen:/

Also das ist, was ich bisher habe. Die Grundidee war, RandomAccessFile zu verwenden und von der Eingabe zu lesen, solange Laufbedingung erfüllt ist. Aber der Leser liest einen Wert mehr, deshalb verwende ich seek(), um beim nächsten Funktionsaufruf an der richtigen Stelle zu lesen. Es muss einen Fehler im Code geben, da nicht alle Läufe gedruckt werden oder nur eine Ausnahme ausgelöst wird.

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("------"); 
} 
} 

Für weitere Fragen lassen Sie es mich bitte wissen.

Hinweis: Es sollte nur für aufsteigende Läufe und Dateien beliebiger Länge funktionieren.

Danke für die Unterstützung.

+1

Es wäre am besten, den Code zu zeigen, den Sie haben müssen, um herauszufinden, warum es Fehler gibt. – Makoto

Antwort

0

Es gibt mehrere Möglichkeiten, dies zu tun.

Lösung 1

Zum Beispiel Ihre Funktion mit einem int aufrufen und einen int refering auf die Anzahl der letzten gedruckten Zeichen machen zurückzukehren.

Run exaple:

nach der ersten Laufe Rückkehr 2 Ursache der Länge des Drucktextes 2 nach der zweiten Durchlauf return 6 Ursache der Länge des Textdruckes 4 +2 aus dem letzten Schleife ... etc.

public int function(int startPoint){ 

// do stuff here 

return lastIndexofPrintChar; 
} 

dann rufen Sie Ihre Funktion wie diese

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

Lösung 2

Sie können Ihre Datei auch doppelt publizieren und jeden von Ihnen gedruckten String entfernen.

+0

Lösung 2 ist hier keine Option, aber Lösung 1 funktioniert möglicherweise. Wolltest du schon jedes Mal gedruckte Elemente überspringen, wenn ich die Funktion anrufe oder? – henrich

+0

Ja. Rufen Sie die Funktion mit einem int 'skipChar' auf, wie viele Zeichen zu überspringen sind. Nachdem Sie getan haben, was Sie die Länge der Zeichenfolge hinzufügen möchten, die Sie zum SkipChar drucken und es zurückgeben.Dann ruf nochmal mit dem "returned" skipChar e.tc – gvlachakis

+0

Werde es jetzt versuchen, danke! – 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");}  
}