1

我将如何在 Java 中制作字符前瞻方法?我有一个文本文件(比方说 TextFile.txt),我需要它首先读取单个字符,识别它,如果它是一个特殊字符(如 { = + ; 等)将其作为 Y 类型的标记返回。如果字符不是特殊字符(如数字或字母),则应向前看是否有特殊字符或空格,当出现特殊字符时,程序应将该组字符作为X 类型的标记。如果程序读取一个数字,然后是另一个数字,然后是一个字母,它应该只返回 Z 类型的两个数字。

例如,在 TextFile.txt 中有以下文本:

{ test; 123test test5
test/-=test}

程序将通读文件,看到一个“{”,将该标记返回为 Y,看到空格,忽略它,看到“t”,因为那不是特殊字符,向前看,看到另一个字母,直到它到达';',并返回'test'作为X类型的标记。程序应该读取'123',将其返回为Z,然后读取'test'并返回X。

我了解程序应该如何工作,但我不知道前瞻字符阅读器要使用什么。我查看了 Scanner 类,但它没有 nextChar() 的方法(这很有用)。

4

7 回答 7

1

我认为您真的不需要任何前瞻字符,只需将整个文本读入字符串并遍历其 char 数组即可。检查 isDigit 或 isLetter 的每个字符 - 如果将其添加到字符串缓冲区,则将缓冲区的内容刷新到包含所有标记的列表中。如果缓冲区为空并且字符是数字,则设置一个标志并在遇到除数字以外的任何内容时立即刷新。我猜应该这样做。

于 2011-11-01T19:25:16.620 回答
1

由于您只需要一个前瞻字符,因此我建议使用PushbackReader. 您也可以使用支持标记的阅读器,但在此应用程序中,我认为推回更容易理解。当前瞻是固定的(在这种情况下是一个字符)时,这两个选项都有效。

简而言之,您从流中读取一个字符并确定它是哪种标记类型(如果它是空格,则将其丢弃并重试)。将令牌的此字符和后续字符累积在类似StringBuilder. 继续阅读,直到你读到一个不属于该类型的字符。将坏字符推回流中,并返回令牌。下次您请求令牌时,被推回的字符将位于流的开头。

以这种方式处理流是节省内存的,因为前瞻是固定的。所需的空间不取决于流的长度(实际上,它适用于无限长的流)。

于 2011-11-01T19:52:23.643 回答
0

听起来像是语言解析。我建议使用 ANTLR。请看一下http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

于 2012-04-24T16:07:22.473 回答
0

您想使用一种类型InputStream(在您的情况下可能是 a FileInputStream)并使用该read()方法一次拉出一个字符。如果这些字符不是特殊字符/空格,请将它们保存在缓冲区中,直到找到特殊字符/空格,然后将缓冲区的内容作为 X 类型的标记返回。

于 2011-11-01T19:16:52.497 回答
0

扫描仪没有nextChar(),但你可以使用Scanner.hasNext(String)。例如

scanner.hasNext("x")

将测试是否有一封信x。对于更复杂的前瞻,您可以使用Scanner.hasNext(Pattern).

于 2011-11-01T19:17:04.610 回答
0

你的问题不是很具描述性......但我认为这可能会给你一个起点。将文本文件的内容拆分为字符数组。然后分别查看每个字符并进行测试/比较

char[] cArray = textToRead.toCharArray();

for(int i = 0; i < cArray.length; i++){
    //perform your logic here
}

遍历每个字符并跟踪您在字符串或字符变量中需要的内容。

于 2011-11-01T19:56:40.443 回答
0

您不需要任何特殊的前瞻功能。您只需要将文件作为 FileReader 打开。然后,在处理每个字符时,如果不是特殊字符,则需要将这些字符累积在单独的 StringBuilder 中,直到达到特殊字符并且可以确定当前标记的类型。

于 2011-11-01T19:21:59.980 回答