Java 从多个文件中读取整数数组
Java read integer arrays from multiple files
我对 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(堆排序(数组))) ?
最终,我正在寻求一些帮助,以将 .txt 文件放入可用的数组中,以便通过各种排序。我首先将所有内容输出到文本文件,以确保每次排序都使用完全相同的数组 运行。
我对 Scanner 比较熟悉,但也读过 FileRead and/or BufferedReader 和其他可能的方法。我只是没有足够的经验来知道在这种情况下什么最有效以及实施它的最佳方法。将不胜感激。
如果您只需要将数组保存到文件存储并重新构造它们,您可以使用序列化。
此 class 只是为了让您了解它的工作原理。
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]);
}
}
}
注意:如果你想运行在不同的执行中使用相同的数组进行不同的排序,我可以理解保存随机数组。但是升序和降序数组总是可以在每次执行时构建。
Regarding System.nanoTime()
有关详细说明,请参阅 https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--。
编辑
如果您已经生成了文本文件,请使用@Antoniosss 解决方案。由于您正在阅读现有文件,因此您只需要修改我在评论中提到的分隔符。
测试
Scanner scanner = new Scanner("[1, 2, 3]");
scanner.useDelimiter("(\s)*[\[,\]](\s)*");
while(scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
输出
1
2
3
为此目的使用一些带分隔符的文件格式,并使用扫描仪读取它。
假设我们的定界符是字符 ;
。像这样存储你的数组
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();
要回读它,请以与以下代码类似的方式使用Scanner
;
ArrayList<Integer> arr=new ArrayList<>();
Scanner scan=new Scanener(new File("yourfile));
scan.useDelimeter(';');
while(scan.hasNextInt()){
arr.add(scan.nextInt());
}
应该可以正常工作。您也可以随时使用换行符作为分隔符。
编辑:如果您不需要以人类可读的形式存储数组,您可以像@Shire Resident 在他的回答中解释的那样使用序列化。
我对 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(堆排序(数组))) ?
最终,我正在寻求一些帮助,以将 .txt 文件放入可用的数组中,以便通过各种排序。我首先将所有内容输出到文本文件,以确保每次排序都使用完全相同的数组 运行。
我对 Scanner 比较熟悉,但也读过 FileRead and/or BufferedReader 和其他可能的方法。我只是没有足够的经验来知道在这种情况下什么最有效以及实施它的最佳方法。将不胜感激。
如果您只需要将数组保存到文件存储并重新构造它们,您可以使用序列化。
此 class 只是为了让您了解它的工作原理。
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]);
}
}
}
注意:如果你想运行在不同的执行中使用相同的数组进行不同的排序,我可以理解保存随机数组。但是升序和降序数组总是可以在每次执行时构建。
Regarding System.nanoTime()
有关详细说明,请参阅 https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--。
编辑
如果您已经生成了文本文件,请使用@Antoniosss 解决方案。由于您正在阅读现有文件,因此您只需要修改我在评论中提到的分隔符。
测试
Scanner scanner = new Scanner("[1, 2, 3]");
scanner.useDelimiter("(\s)*[\[,\]](\s)*");
while(scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
输出
1
2
3
为此目的使用一些带分隔符的文件格式,并使用扫描仪读取它。
假设我们的定界符是字符 ;
。像这样存储你的数组
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();
要回读它,请以与以下代码类似的方式使用Scanner
;
ArrayList<Integer> arr=new ArrayList<>();
Scanner scan=new Scanener(new File("yourfile));
scan.useDelimeter(';');
while(scan.hasNextInt()){
arr.add(scan.nextInt());
}
应该可以正常工作。您也可以随时使用换行符作为分隔符。
编辑:如果您不需要以人类可读的形式存储数组,您可以像@Shire Resident 在他的回答中解释的那样使用序列化。