Java 从文本文件获取下一次运行
我试图用Java编写一个函数,从txt文件返回下一个升序序列(run),假设函数的返回类型是ArrayList 我的示例文件input.txt包含下一个值:78123421。因此,就运行次数而言,这意味着文件有4次运行:| 78 | 1234 | 2 | 1 | 我在这里想要达到的是,当我从main()调用这个函数四次时,它应该打印如下内容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
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。我想它现在已经修复了,代码正在按预期工作。谢谢你的支持。