我对Java比较新,所以我必须不断查看如何做事。我正在开发一个项目,涉及分析一些熟悉的排序,例如堆排序,合并排序等。我写了一些代码来生成各种不同的数组,每个数组都在自己的.txt文件中。以下是代码的一部分:
import java.io.*;
import java.util.Arrays;
import java.util.Collections;
public class ArrayBuilder {
public static void main(String[] args) throws IOException {
for(int i = 2; i < 7; i++) {
int aLength = (int)Math.pow(10, i);
buildAscendingArray(aLength);
buildDescendingArray(aLength);
buildRandomArray(aLength);
}
}
public static void buildAscendingArray(int arrayLength) throws IOException {
File file = new File("arrays_" + arrayLength + "A.txt");
PrintWriter printWriter = new PrintWriter(file);
int[] array = new int[arrayLength];
for(int i = 0; i < array.length; i++) {
array[i] = i + 1;
}
printWriter.println(Arrays.toString(array));
printWriter.close();
}
我没有包含随机和降序方法,因为它们或多或少相同,因此试图节省空间。所以...
我已经对所有类型进行了编码,我只想弄清楚如何读取整数数组,以便我可以通过不同的排序运行它们。我还尝试在System.nanoTime()中添加因子来计算运行每个排序所需的时间,以便在给定各种输入的情况下对它们进行比较。不确定是否需要将其添加到每种排序的方法中,或者是否可以在调用中实现,即。 System.nanoTime(heapsort(array)))?
最终,我正在寻找一些帮助,将.txt文件放入一个可用的数组中,以便将它传递给每一种。我首先输出所有文本文件,以确保每种类型都运行完全相同的数组。
我对Scanner有点熟悉,但也读过有关FileRead和/或BufferedReader以及其他可能的方法。我没有足够的经验知道在这种情况下最有效的方法以及实施它的最佳方法。非常感谢帮助。
答案 0 :(得分:0)
如果您只需要将数组保存到文件存储并构建它们,则可以使用序列化。
本课程只是为了让您了解它的工作原理。
public class ArrayReaderWriter {
public static void main(String[] args) throws Exception {
writeArray(20);
readArray(20);
}
public static void writeArray(int arrayLength) throws IOException {
File file = new File("arrays_" + arrayLength + "A.ser");
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
int[] array = new int[arrayLength];
for (int i = 0; i < array.length; i++) {
array[i] = i + 1;
}
os.writeObject(array);
}
public static void readArray(int arrayLength) throws IOException, ClassNotFoundException {
File file = new File("arrays_" + arrayLength + "A.ser");
ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));
int[] array = (int[]) is.readObject();
// Printing here to verify
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
注意:如果要在不同的执行中运行具有相同数组的不同排序,我可以理解保存随机数组。但是,升序和降序数组总是可以在每次执行时构建。
关于System.nanoTime()
有关详细说明,请参阅https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--。
修改强>
如果您已经生成了文本文件,请使用@Antoniossss解决方案。您只需要修改我在评论中提到的分隔符,因为您正在阅读现有文件。
<强>测试强>
Scanner scanner = new Scanner("[1, 2, 3]");
scanner.useDelimiter("(\\s)*[\\[,\\]](\\s)*");
while(scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
<强>输出强>
1
2
3
答案 1 :(得分:0)
为此目的使用一些delimetered文件格式并使用scanner读取它。
可以说我们的分隔符是;
字符。像这样存储你的数组
File file = new File("arrays_" + arrayLength + "A.txt");
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
printWriter.print(1);
for(int i = 1; i < array.length; i++) {
printWriter.print(';'); // delimeter
printWriter.print(i+1);
}
printWriter.close();
要阅读它,请以simillar方式使用Scanner
以下代码;
ArrayList<Integer> arr=new ArrayList<>();
Scanner scan=new Scanener(new File("yourfile));
scan.useDelimeter(';');
while(scan.hasNextInt()){
arr.add(scan.nextInt());
}
应该工作得很好。您也可以始终使用换行符作为分隔符。
编辑:如果你不需要以人类可读的形式存储数组,你可以像@Shire Resident在他的回答中解释的那样使用序列化。