2016-08-25 2 views
-3

Я пытаюсь написать функцию в Java, который возвращает следующую восходящего последовательности (запуск) из текстового файла, скажем, типа возвращаемого значения функции будет ArrayList.Получить следующий запуск из текстового файла

Мой пример файла input.txt содержит следующие значения: 78123421. Так что в терминах прогонов это означает, что файл имеет 4 пробега: | 78 | 1234 | 2 | 1 |.

Что я пытаюсь достичь здесь, как, когда я назвал бы эту функцию из основных() четыре раза он должен напечатать что-то вроде

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

или только два вызова должны напечатать

1.run: 78, 
2.run: 1234 

Я попытался решить свою проблему, используя BufferedReader/FileReader и RandomAccessFile, но пока не нашел рабочего решения, пожалуйста, помогите:/

Так вот что я до сих пор. Основная идея состояла в том, чтобы использовать RandomAccessFile и читать с ввода, пока условие выполнения выполнено. Но читатель читает одно значение больше, поэтому я использую seek(), чтобы начать чтение в правильной позиции, когда происходит следующий вызов функции. В коде должна быть ошибка, потому что она не печатает все прогоны или просто срабатывает Исключение.

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 ссылается на номер последнего напечатанного полукокса.

Run 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

Да. Вызовите функцию с помощью функции 'skipChar' из числа символов, которые нужно пропустить. После того, как вы сделаете то, что хотите добавить длину строки, вы печатаете на skipChar и возвращаете ее.Затем снова вызовите «возвращенный» 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");}  
} 
Смежные вопросы