【问题标题】:Java read integer arrays from multiple filesJava从多个文件中读取整数数组
【发布时间】:2016-04-14 02:43:01
【问题描述】:

我对 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 以及可能的其他一些方法。我只是没有足够的经验知道在这种情况下什么最有效以及实现它的最佳方法。非常感谢您的帮助。

【问题讨论】:

  • 为什么要保存升序和降序数组?这种逻辑不会每次都产生相同的数组吗?
  • 您真的需要文本文件还是只需要文件存储?如果只需要文件存储,您可以将数组按原样写入文件并使用 ObjectOutputStream 和 ObjectInputStream 直接读取。
  • 我已经有了文本文件,这是否是最有效的处理方式无关紧要。我只是在寻求有关如何继续的帮助,而不是如何重新开始。如果有的话,在我看来,它有助于将程序的不同方面作为一个整体分离出来。

标签: java arrays sorting bufferedreader filereader


【解决方案1】:

如果您只需要将数组保存到文件存储并重新构造它们,您可以使用序列化。

本课程只是为了让您了解它的工作原理。

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

【讨论】:

  • 我喜欢这个主意,但我不确定我的情况需要多少重新排列。目前我已经按照说明生成了 .txt 文件。排序算法位于 Eclipse 中不同项目下的不同类中。如果我这样做,我知道如何实现这一点的唯一方法就是将该代码与我的所有类型的类放在同一个类中,这样所有事情都会一次完成。不确定这是否会在调试方面造成问题,因为它可能会运行几个小时,如果它编译,我直到之后才会意识到错误。
  • 将代码更改为您的建议并将 readArray 方法用于我的 sortAnalysis 类实际上并不难,现在我只是从那里开始工作。我认为最终这会使它变得更容易一些。感谢您的所有帮助!
【解决方案2】:

为此目的使用一些带分隔符的文件格式并使用扫描仪读取它。 假设我们的分隔符是字符;。像这样存储你的数组

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 在他的回答中解释的那样。

【讨论】:

  • 我目前的做法是每个文本文件都被格式化为 [1, 2, 3, ..., n ]。是否可以使用逗号作为分隔符,因为它已经存在,还是我误解了它的使用方式?
  • @TheDubiousDubber 您可以使用逗号,但那些括号和空格会导致问题 - 使用scanner.useDelimiter("(\\s)*[\\[,\\]](\\s) *");那应该只留下数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2014-04-21
  • 1970-01-01
  • 2010-09-23
  • 2012-01-13
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多