我創建了一個字串型別的公共陣列,其大小為30000。
我需要將文本檔案中的條目逐行填充到陣列中。 該 txt 檔案每行都有一個新的單詞。
我可以用 ArrayList 來完成這個任務,但我必須使用一個陣列。
到目前為止,我的代碼如下:
public static String[] arrayin = new String[30000] 。
public static void CreateDict(String filepath) {
Scanner scanner = new Scanner(filepath)。
for(int i = 0; i < arrayin.length; i ) {
arrayin[i] = scanner.next()。
}
System.out.println(arrayin)。
}
我得到的錯誤是:
執行緒"main"java.util.NoSuchElementException中出現例外。
在java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1478)
at CreateDictionary.CreateDict(CreateDictionary.java:27)
at CreateDictionary.main(CreateDictionary.java:13)
uj5u.com熱心網友回復:
你的前提條件令人厭煩(因為它們非常愚蠢,你永遠不會在一個真正的專案中這樣做,所以這個練習的教學價值是高度可疑的。如果你有能力改變這種教育的來源,例如,如果這是一個教程或書,你可以找到/買到另一個,請考慮這樣做)。
你遇到的問題是,你正好回圈了30000次,因此如果你的流中少于30000個標記,你的代碼就會崩潰。
兩點:
.next()是否真的是你想要的?
next()將回傳 "下一個標記"。例如,如果第一行是foo bar,那將是two tokens。如果這是你想要的,太棒了。如果你想讓foo bar的全部內容成為一個標記(例如,因為你的字串陣列中的每個條目應該包含一整行),那么首先修復掃描器,以注冊你認為 "一個新行 "是 "標記之間的東西",而不是 "任何數量的空白"。要做到這一點,只需運行scanner.useDelimiter("R")/code>。R是java語言的意思。一個換行。
- 回圈直到你的行數用完,而不是'正好30k次'。
簡單地永遠回圈,直到掃描器沒有什么可提供的了:
int index = 0;
while (scanner.hasNext()) {
arrayin[index ] = scanner.next();
如果有超過30k的標記,這將崩潰(陣列會太小)。這聽起來像是你想要的;如果你只是想讓代碼默默地忽略超過第30000個標記,你必須添加(使用&&)第二個條件,即索引低于30k。否則,當檔案耗盡時,它就會停止,使你的30k大小的字串陣列中的所有剩余槽成為空指標。
uj5u.com熱心網友回復:
public static String[] arrayin;
public static void CreateDict(String filepath) {
Path path = Paths.get(filepath)。
arrayin = Files.lines(path, Charset.defaultCharset() )
//.limit(30_000)
.toArray(String[]:new)。
System.out.println(Arrays.toString(arrayin))。
這是一個Stream<String>解決方案。它是一種富有表現力的、更具宣告性的編程方式,在更復雜的情況下,它可以很好地優化,甚至并行化事情。
這將每一行都放在陣列中(沒有換行)。 與你的代碼不同的是,你的代碼不是每行都有每個字。 而且它將陣列的大小與檔案中的行數一致。 人們可以根據out.commented陳述句來限制陣列。
你的問題是在檔案少于30000字時沒有使用hasNext()。可以選擇hasNextLine()和nextLine()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306918.html
標籤:
