2014-11-23 35 views
2

這裏的位置是一個簡單的例子,說明我有這個問題:記得在掃描儀

public static String nextTwoTokens(Scanner scan) { 
    String partOne = scan.next(); 
    String partTwo = scan.next(); 
    return partOne+partTwo; 
} 

這應該工作得很好,但我不希望修改中的「光標」的位置掃描儀與我的兩個.next()的。

從我讀過的,你不能複製一個掃描儀對象。在那種情況下,我將如何「記住」掃描儀中光標的位置,然後在返回此方法之前返回該位置?

如果我不能這樣做,有沒有一種方法可以讓掃描儀讀取來源以建立另一個掃描儀?在這種情況下,如果我需要創建另一臺掃描儀,那麼新掃描儀在文件/輸入流/其他位置開始時會很好,這與舊掃描儀的光標位置相反。

+0

據我所知,你不知道。你不能。和不。你需要另一種方法。 – 2014-11-23 02:45:03

+0

對此不完全確定,所以我會留下它作爲評論。有一個'Scanner(ReadableByteChannel)'構造函數可用。還有一個['FileChannel'](https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html),它允許你設置當前的讀取位置。 – Obicere 2014-11-23 03:10:16

回答

2

Scanner類實際上並未實現Cloneable接口。你可以通過實現Cloneable接口來自定義方法.clone(),但在這種情況下,克隆不是一個好主意。

要回答你的問題,不,你不能這樣做。你需要找到更好的方法。

另一種方法可以使用方便的.split(delimiter)方法創建String[]!所以,你可以做這樣的事情:

String s = "This is a test."; 
String[] tokens = s.split(" "); //split the string into tokens, cutting at the spaces 
for(String token : tokens) { 
    System.out.println(token); 
} 

這應該打印出來



一個
測試。

這樣,您可以循環訪問String[]以獲取下一個令牌,然後返回到上一個點。

並回答您的評論提出了這個問題,如果你想要做的比一個字符串,它並沒有真正有一個分割法以外的東西,我會建議只是在做這樣的:

Scanner scan = new Scanner(INITIALIZE ME HOWEVER YOU WANT); 
ArrayList<String> tokens = new ArrayList<String>(); 
while(scan.hasNext()) { 
    tokens.add(scan.next()); 
} 

基本上,只需閱讀所有內容並從中創建一個永久的,可導航的令牌集。

這是我能給的最好的建議。這可能不是最有效的方式,但它確實是一個絕對的方法。

+0

我將如何使用類似於您的示例的方法,但是該方法可以接受掃描程序通常能夠解析的任何類型的輸入(而不僅僅是字符串)?我研究了'Readable'接口,但不包含'File'。如果我想這樣做,是否需要製作多個方法,如多個「Scanner」構造函數的方法,然後使用相同的「.split」方法將它們標記爲用於解析任何對象的對象? – Starwarswii 2014-11-23 03:13:41

+0

'Scanner#next()'不會返回其他字符串,因此沒有理由使用'Object'作爲列表的通用類型。 – Tom 2014-11-23 03:48:22

+1

@Tom謝謝湯姆。我確定了答案。 – 2014-11-23 03:49:17

0

您可以使用scan.match().end()來獲取流中最後返回的令牌的位置。

(這並不能解決OP的問題,但它是一個有效的問題的答案的標題,它解決了我的問題。)