[英]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.