2015-03-31 77 views
0

我是一年級的編程學生,所以如果這是一個愚蠢的問題,請原諒我。如何從一個文本行創建多個數組?

我想要做的是讀取一個文本文件,其中包含第1行的答案關鍵字,並且後續行將包含學生的ID號和他們對測試的答案。這裏有一個例子:

TFFTFFTTTTFFTFTFTFTT 
ABC54301 TFTFTFTTTTF TFTFTFTT 
ABC54302 TFFTFFFFFFFFTFTFTFTT 
ABC54303 TFFTFFTTTTFFTFTTTTTT 
ABC54304 TFFTTTFFTTFFTFTFTFTT 
ABC54305 TFTFTFTTTTFFTFTFTFTT 

我的想法是創建三個陣列 - 一個只包含了接聽鍵,一個包含學生的ID號,以及一個包含studentss答案。學生身份證號碼總是8位數字,但可能包含空格。學生的答案總是20個字符,但也可以包含空格。所以我不能根據空格來分割它們。

的說明包含在此:

while (inFile.hasNext()) 
{ 
    ... 
} 

where 'inFile' is the Scanner object connected to the input file. 

Each student's record should be read by two read's -- 
one string (for ID) and another string (answer string). 

我幾乎失去了。我最初的想法是循環遍歷第一行,並將行的每一段設置爲它的補充數組。我接觸到的問題是,我似乎無法找到任何指示或澄清如何根據字符數來分割線條。

我想也許是這樣的:

while (inFile.hasNext()) 
{ 
    // I would somehow set the first line to its own array 
    // As the loop continues, as long as its not the first line 
    idNums[i] =  //Characters 1-8 
    studentAnswers[i] =  //Characters 10-30 
} 

是合理的?還是有更簡單的方法?我覺得我正在以一種比必要更復雜的方式來解決這個問題。

編輯:

學習更多有關地圖和正則表達式之後,我嘗試幾個不同的版本這個代碼。第一個包括了:

while (scan.hasNextLine()) { 
    String[] studentInfo = scan.nextLine().split(" ", 2); 
    info.put(studentInfo[0], studentInfo[1]); 
} 

哪一種工作,但問題是,如果它用空格結束,它不會保存完整的20個字符。這是一個問題嗎?我不確定。目前我測試這個:

String[] answerKey = scan.nextLine().split(""); 

Map<String, String[]> results = new HashMap<>(); 
while (scan.hasNextLine()) { 
    String line = scan.nextLine(); 
    results.put(line.substring(0, 8), line.substring(9).split("")); 
} 

這是給我正確的鑰匙,但不正確的值。這些值似乎指向內存位置。例如:

{ABC54339=[Ljava.lang.String;@55f96302 

回答

0

在while循環之前先讀取第1行。你可以把它變成一個這樣的數組:

String[] answers = inFile.nextLine().split(""); 

通知,正則表達式告訴拆分每個字符之間的分裂。

然後閱讀結果,最好將學生ID和他們的答案保存在一起 - 地圖是一個明顯的選擇,因爲它存儲鍵/值對,但也因爲它會自動增長。

使用子字符串獲取該行的前8個字符並獲取結果,並在地圖中顯示put()。將結果值存儲爲一個數組,使用上面的相同拆分調用創建。

Map<String, String[]> results = new HashMap<>(); 
while ... 
    results.put(line.substring(0, 8), line.substring(9).split("")); 

僅供參考,如果你使用的是Java 8,你可以做一個行(即沒有環),雖然它有點火車失事的:

Map<String, String[]> results = StreamSupport 
    .stream(Spliterators.spliteratorUnknownSize(inFile, 0)) 
    .collect(Collectors.toMap(s -> s.substring(0, 8), s -> s.substring(9).split("")); 

由於另外,如果你的老師給了你初始代碼供你填寫,這就清楚地表明他或她的軟件設計技能很差;掃描器變量不應該包含單詞「文件」,因爲它在輸入流上運行,而不僅僅是文件輸入流 - 例如,您的代碼可以通過命令行運行輸入。代碼不應該知道,關心或建議輸入的特定來源:scanner或簡單地in將是更好的選擇。

+0

由於我還沒有了解地圖 - 但是聽到從一對夫婦在這裏的用戶,那將是我如何處理這個問題,你介意提供一個小一點。的骨架代碼或僞代碼舉例說明地圖在這種情況下的工作方式?我正在使用Java 8. – ccsum 2015-03-31 21:04:59

+0

我想我犯了一個簡單的錯誤,但我看不到它是什麼。我在過去的幾個小時裏一直在研究地圖和正則表達式 - 也許我一直在考慮這個太久,或者我只是在做一些錯誤的事情。 將用新代碼更新原始帖子。我在評論中試了一下,它不起作用 - 哎呀! – ccsum 2015-04-01 00:16:34

+0

與java 8你可以使用空白正則表達式'「」'分割每個字符 - 不要學習正則表達式(它會炒你的大腦)。忽略java 8代碼 - 這僅僅是爲了興趣。嘗試簡單的循環 - 它應該工作。循環後打印地圖,看看它的工作。然後你可以迭代map.entrySet()' – Bohemian 2015-04-01 00:25:37

0

因爲你的指令明確地說,你應該讓2讀取,我發現最好的方法閱讀This Documentation滿足這些指令是Scanner.Next(string)

它看起來像「模式」參數期望一個正則表達式後, http://rubular.com/是用於嘗試使用正則表達式的很好的資源,它也爲基本的正則表達式語法提供了參考。

爲了您的方便,匹配8個字符的正則表達式是這樣".{8}"

如果你使用正則表達式,請確保你逃避,你使用正則表達式轉義序列(上逃生的所有\小號java和1爲正則表達式語言),所以要匹配數字數字,您必須使用"\\d"

+0

感謝你鏈接文檔和鏈接!我一定會考慮這些資源。我們還沒有學過正則表達式,所以在解決這個問題的時候我會學習。這個問題的章節內容是關於數組的。 – ccsum 2015-03-31 21:01:32

+0

經過幾個小時的實驗後,我似乎無法得到正則表達式正常工作。我只需要一定數量的字符就可以停止,但您推薦的分隔符(「。{8}」)似乎不起作用。空間工作,但我需要保留空間。我現在很難過,但我會繼續努力。 – ccsum 2015-04-01 00:26:46

0

將第一行讀入字符串並將其保留爲字符串(該字符串是字符數組)。使用學生的ID作爲鍵(使用line.substring(0,line.indexOf(「」))和行的其餘部分(字符串)作爲Map的值(線),讀取其餘行並將其存儲在Map中.substring(line.indexOf(」「)+ 1)+1是跳過的空間。

現在,你可以通過你的地圖和每個學生的(串)的回答比較你的答案的關鍵

for (int i = 0; i < answer.Length; i++) 
{ 
    // Make sure you don't step out of bounds of the array for student's answer 
    // Any answers not checked will be considered wrong 
    if (i < studentsAnswer.Length) 
    { 
     if (studentsAnswer.charAt(i) != answer.charAt(1)) 
     { 
      numberOfIncorrect = numberOfIncorrect + 1; 
     } 
    } 
    else 
    { 
     numberOfIncorrect = numberOfIncorrect + 1; 
    } 
} 

希望這有助於...

+0

謝謝!我不知道Google Maps是什麼,但即使只有正確的研究術語也能幫助我。 – ccsum 2015-03-31 20:58:45

+0

我編輯了我原來的帖子。將第一行保存爲字符串的想法非常完美 - 但是我試圖正確地將鍵/值輸入到Map中,我很難過。也許我只是堅持語法? – ccsum 2015-04-01 00:25:08

+0

你的映射的第二個參數不需要是一個字符串數組,只需將它作爲一個字符串(Map )即可。然後,當你把鍵/值放到你的地圖中時,你不需要分割值(results.put(line.substring(0,8),line.substring(9))。只需瀏覽地圖中的所有鍵/值對,然後就可以在我的答案中使用我的代碼段來檢查結果。 – Shar1er80 2015-04-01 13:36:23

相關問題