Java 从文本文件获取下一次运行

Java 从文本文件获取下一次运行,java,algorithm,Java,Algorithm,我试图用Java编写一个函数,从txt文件返回下一个升序序列(run),假设函数的返回类型是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

我试图用Java编写一个函数,从txt文件返回下一个升序序列(run),假设函数的返回类型是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()在正确的位置开始读取。代码中一定有一个bug,因为它不会打印所有的运行或者只是触发一个异常

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("------");
 }
}
导入java.io.File;
导入java.util.ArrayList;
导入java.io.RandomAccessFile;
公共类GetRunsFromFile
{
静态长启动=0;
静态长读长度=0;
公共静态void main(字符串[]args)引发异常
{
File in=新文件(“C:/Users/henrich/Desktop/Gimp.txt”);
RandomAccessFile raf=新的RandomAccessFile(在“r”中);
ArrayList当前运行=新建ArrayList();
for(int i=1;i=val)
{             
read_len=raf.getFilePointer()-start;
start=raf.getFilePointer();
运行。添加(v);
val=v;
}
其他的
{         
seek(raf.getFilePointer()-read_len);
start=raf.getFilePointer();
回程;
}
}
返回null;
}
私有静态void printarylist(ArrayList al)
{

对于(inti=0;i,有几种方法可以做到这一点

解决方案1 例如,使用int调用函数,并使其返回一个int,该int表示最后一个打印字符的编号

运行示例:

第一次运行后返回2,因为打印文本的长度为2 第二次运行后,返回6,因为打印文本的长度是从最后一个循环开始的4+2…等等

public int function(int startPoint){

// do stuff here

return lastIndexofPrintChar;
}
然后像这样调用函数

loop{
int result=0;
result= function(x);
}
解决方案2 您还可以复制文件并删除打印的每个字符串。

private static void getNextRun()
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");}     
}
{ 尝试 { BufferedReader br=new BufferedReader(新文件阅读器(新文件(“C:/Users/henrich/Desktop/Gimp.txt”)); br.跳过(跳过行); INTV; 弦线; int val=Integer.MIN_值; ArrayList al=新的ArrayList(); 而((line=br.readLine())!=null) { 跳过_行+=行长度()+2; v=Integer.parseInt(line.trim()); 如果(v>=val) { al.添加(v); val=v; } 其他的 { 跳过_行-=行长度()+2; 打印阵列列表(al); 打破 } } br.close(); } catch(异常e){System.out.println(“EOF”);} }
最好显示您必须尝试的代码,并指出出现故障的原因。解决方案2在这里不是一个选项,但解决方案1可能会起作用。您的意思是每次调用该函数时都跳过已打印的元素吗?是的。调用该函数时,使用指向“skipChar”的要跳过的字符数。完成后,您要添加打印到skipChar并返回的字符串的长度。然后用“returned”再次调用skipChar e.tcI提出了一个似乎有效的解决方案,但有一个错误我无法解决。它发生在读取文件的最后一行时。ArrayList al包含正确的值,但流不会在else语句中继续并打印出最后一个值。它也不会转到catch语句。知道问题是什么吗?请参阅我的c下面是ode。我想它现在已经修复了,代码正在按预期工作。谢谢你的支持。