Java 读取包含随机数的文件,对其进行排序,然后写入其他文件
在一次采访中,我被问到以下问题: 有一个名为sourceFile.txt的文件,其中包含一个接一个排列的随机数,如下所示Java 读取包含随机数的文件,对其进行排序,然后写入其他文件,java,java-io,Java,Java Io,在一次采访中,我被问到以下问题: 有一个名为sourceFile.txt的文件,其中包含一个接一个排列的随机数,如下所示 608492 213420 23305 255572 64167 144737 81122 374768 535077 866831 496153 497059 931322 同一数字可以出现多次。sourceFile.txt的大小约为65GB 我需要读取该文件并将数字写入新文件,比如destinationFile.txt,按排序顺序 我为此编写了以下代码 /* C
608492
213420
23305
255572
64167
144737
81122
374768
535077
866831
496153
497059
931322
同一数字可以出现多次。sourceFile.txt的大小约为65GB
我需要读取该文件并将数字写入新文件,比如destinationFile.txt,按排序顺序
我为此编写了以下代码
/*
Copy the numbers present in the file, store in
list, sort it and than write into another file.
*/
public static void readFileThanWrite(String sourceFileName,String destinationFileName) throws Exception{
String line = null;
BufferedReader reader = new BufferedReader(new FileReader(sourceFileName));
List<Integer> list = new ArrayList<Integer>();
do{
if(line != null){
list.add(Integer.parseInt(line));
}
line = reader.readLine();
}while(line != null);
Collections.sort(list);
File file = new File(destinationFileName);
FileWriter fileWriter = new FileWriter(file,true); // 'True' means write content to end of file
BufferedWriter buff = new BufferedWriter(fileWriter);
PrintWriter out = new PrintWriter(buff);
for(Iterator<Integer> itr = list.iterator();itr.hasNext();){
out.println(itr.next());
}
out.close();
buff.close();
fileWriter.close();
}
/*
复制文件中的数字,并存储在
列出、排序并写入另一个文件。
*/
公共静态void readFileThanWrite(字符串sourceFileName,字符串destinationFileName)引发异常{
字符串行=null;
BufferedReader reader=新的BufferedReader(新文件读取器(sourceFileName));
列表=新的ArrayList();
做{
如果(行!=null){
add(Integer.parseInt(line));
}
line=reader.readLine();
}while(line!=null);
集合。排序(列表);
文件文件=新文件(destinationFileName);
FileWriter FileWriter=newfilewriter(file,true);//“true”表示将内容写入文件末尾
BufferedWriter buff=新的BufferedWriter(fileWriter);
PrintWriter out=新的PrintWriter(浅黄色);
for(迭代器itr=list.Iterator();itr.hasNext();){
out.println(itr.next());
}
out.close();
buff.close();
fileWriter.close();
}
但采访者说,由于文件太大,上述程序将无法加载和排序数字
什么是更好的解决方案?如果您知道所有的数字都相对较小,那么保留一个事件数组就可以了。
如果您没有关于输入的任何信息,那么您正在查找。这是一个可以帮助您的方法,这是。这些数字都是100万以下的正整数,这是偶然的,还是问题规范的一部分。这些数字的最大限制是什么?您采用的是一种非常幼稚的方法,对于任何重大的工作负载都是失败的。好消息是,这让面试官对你的技能有了一个非常清晰的认识。坏消息是你还有很多东西要学。@QBrute那么你可能也得不到那份工作。对65GB的数字进行排序需要特定的机制,否则将耗尽内存。@QBrute,这将如何缓解无法将所有数字保存在内存中的问题?采用相同的方法,但仍然无法找出我的方法失败的地方,但您的答案表明我的方法是正确的,有人误解了它。:)我把你的职位提高了。我没有测试你的代码,但我敢说当输入正确时它应该可以工作。