【问题标题】:Reading data from file into array then outputting data into another file将文件中的数据读取到数组中,然后将数据输出到另一个文件中
【发布时间】:2014-01-28 16:43:50
【问题描述】:

需要一些帮助来解决这个问题。 我想将 data.txt 中的数据输入到 bsorted.txt 中,并使用bubbleSort对其进行排序。

我需要将随机数和字母生成到一个数据文件中,然后将它们读入一个数组,并在排序后将这些数据输出到另一个文本文件中。

我收到了NoSuchElementException

Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Unknown Source) at SortingExample.main(SortingExample.java:257)

代码:

class dataFile {

public static void dataFile() {
    try {
        PrintWriter writer = new PrintWriter("data.txt");
        String alphaNumerics = "qwertyuiopasdfghjklzxcvbnm1234567890";
        String t = "";
    for (int i = 0; i < 2000; i++) {
        t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
    }
        writer.println(t);
        writer.close();
    }
    catch(Exception ex) {
        System.out.println("Error accessing file.");
        System.out.println("Reason was: "+ex.getMessage());
        ex.printStackTrace();
    }
  }
}

class SortingExample {

public static void main(String[] args) throws IOException { 
    dataFile.dataFile();

    Scanner bscan = new Scanner(new File("data.txt"));
    PrintWriter bsorted = new PrintWriter("bsorted.txt");
    StringType[] strings = new StringType[2000];
    for (int i = 0; i < strings.length; i++){
        strings[i] = new StringType(bscan.nextLine());
    }

    Sort.bubbleSort(strings);
    bsorted.println("Bubble Sort number of comparisons: " + Sort.bubbleComp + "\r\n" + "Bubble Sort number of exchanges: " + Sort.bubbleEx + "\r\n");
    for (int i = 0; i < strings.length; i++) {
        bsorted.println(strings[i].toString());
    }
    bsorted.close();
   }
}

作为任何人有什么想法可以帮助我吗?

【问题讨论】:

  • 也发布您的例外情况,它将为人们提供一个很好的起点来帮助您。

标签: java arrays file printwriter


【解决方案1】:

在我看来,循环运行的次数比文件中的行数还要多。

您的 data.txt 文件中的行数可能少于 2000 行,但 for 循环仍会尝试执行大约 2000 次并每次从该文件中读取另一行。

我建议你弄清楚 data.txt 中有多少行,然后多次循环 for 循环。

试试这个代码来确定行数:

LineNumberReader lnr = new LineNumberReader(new FileReader(new File("data.txt")));

lnr.skip(Long.MAX_VALUE);

那么你所要做的就是绕过你的循环lnr.getLineNumber() 次。

【讨论】:

    【解决方案2】:

    根据您的代码:

    for (int i = 0; i < 2000; i++) {
        t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
    }
        writer.println(t);
        writer.close();
    

    您似乎将所有内容都附加到一个字符串中,然后将其写成一个大行。换句话说,您将 2000 个元素连接到一个字符串中。

    您的扫描仪正在寻找 2000 行,所以当它只看到一个时它就会失败。

    我的建议是多写几行如下:

    for (int i = 0; i < 2000; i++) {
        t = alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
        writer.println(t);
    }
    
    writer.close();
    

    题外话了,但是从 OO 的角度来看,有很多约定让我停下来,比如小写的类名 (dataFile),一个不像动词的方法名 (dataFile)

    【讨论】:

    • 我实际上做了那个编辑,我想我必须删除 data.txt 才能刷新。
    • 我修复了一些东西,现在 data.txt 中的数据由于某种原因已经排序了。
    【解决方案3】:

    在继续通过扫描仪阅读下一行之前,您需要检查Scanner.hasNextLine() 是否为真。这将帮助您确定是否已安全到达文件结束标记。

    因此您的for loop 将是:

    for (int i = 0; i < strings.length; i++) {
        if (bscan.hasNextLine())
            strings[i] = new StringType(bscan.nextLine());
    }
    

    或者,在您的尝试中处理它并捕获NoSuchElementException

    try {
        for (int i = 0; i < strings.length; i++) {
            strings[i] = new StringType(bscan.nextLine());
        }
    } catch (NoSuchElementException ex) {
        // Do Nothing
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多