2013-12-21 23 views
0

我有嚴重的問題來了解掃描程序類的工作原理。事實上,我想從這個輸入:如何掃描文本中沒有換行符的單詞?

AAAA BBBG GREZZ

ADFG GTRE

FREZZ

有這樣的輸出中的一個ArrayList: [AAAA,BBBG,GREZZ,ADFG,GTRE ,FREZZ]

我的代碼如下:

System.out.println("list of words?"); 
Scanner scan3 = new Scanner(System.in); 
scan3.useDelimiter("[\\s+\\n]"); 
ArrayList<String> test = new ArrayList<String>(); 
while(scan3.hasNext()){ 
    String temp = scan3.next(); 
    if(temp.equals("STOP")){ 
    break; 
    }else{ 
    test.add(temp); 
    } 
} 
System.out.println(test); 

我輸入的是:

AAAA BBBG GREZZ

ADFG GTRE

FREZZ STOP

而且我的輸出繼電器是: [AAAA,BBBG,GREZZ,ADFG,GTRE,FREZZ]

我的問題是雙重的:

  • 爲什麼我甲肝e列表中插入一個空元素(這是我相信新行)?
  • 正如您可能已經注意到的,爲了停止循環,我在末尾添加了字符串「STOP」,因爲條件scan3.HasNext()總是返回「true」,是否繼續進行?

非常感謝您的幫助。

回答

0

只需使用String#split()並附上一個合適的分隔符(聽起來就像在這種情況下,您只需要"[ \\n]+"(這是一個空格和\ n),但您可能需要稍微調整一下,例如,您可能想要分割所有空格

列表中空條目的原因是因爲您只是掃描空格的單個字符,當您有兩個相鄰的行結束符時,它會匹配兩次,所以您需要修改正則表達式它匹配多個字符

+0

謝謝你的回答。但是要使用'String.split()',我需要首先獲取完整的字符串,但爲此我需要掃描我的文本,以便它不會改進代碼,是嗎? 正如你所說的修改我的正則表達式後,我沒有空的條目了,但我不明白你的解釋: '你有兩個相鄰的行結束符':它怎麼可能? – user3125129

+0

AAAA BBBG GREZZ ADFG GTRE 這兩行之間有2行結尾,所以當你拆分它時,會在空行找到空字符串。 –

0

您的+看起來是在錯誤的地方,請嘗試使用scan3.useDelimiter("[\\s\\n]+");

關於,

正如你可能已經注意到,我爲了停止循環,因爲條件scan3.HasNext()總是返回「真」添加字符串「STOP」的結尾,它是唯一的方法呢?

您希望進行什麼其他方式?你打算使用什麼其他停止條件?

+0

首先感謝您的回答。關於停止條件,它實際上沒有看到任何其他的方式來做到這一點,但它看起來像修補工作給我。 事情是,我不明白爲什麼'scan3.HasNext()'返回true時,沒有什麼更多(和我按下「Enter」按鈕) – user3125129

+0

@ user3125129:因爲如果它確實返回false,那麼它將完全無法正常工作,因爲它無法等待用戶輸入。它如何區分等待輸入和完成輸入?仔細考慮一下,這一點很清楚。 –