簡體   English   中英

從文件讀取數據到數組,然后將數據輸出到另一個文件

[英]Reading data from file into array then outputting data into another file

需要一些幫助來解決這個問題。 我想將數據從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();
   }
}

作為任何人的想法可以幫助我?

您需要先檢查Scanner.hasNextLine()是否為true,然后才能繼續通過掃描儀讀取下一行。 這將有助於您確定是否已安全到達文件結尾標記。

因此,您的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
}

在我看來,循環執行的次數比文件中的行多。

您的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()次。

根據您的代碼:

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

似乎您將所有內容都附加到一個字符串中,並作為大行寫出一次。 換句話說,您將2000個元素串聯到一個字符串中。

您的掃描儀正在尋找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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM