通过JAVA字符串标记器循环
求你了,我急需帮助。多谢各位 我从我的硬盘上读到一个文本文件,其中包含以下内容通过JAVA字符串标记器循环,java,Java,求你了,我急需帮助。多谢各位 我从我的硬盘上读到一个文本文件,其中包含以下内容 void main() { int A = 5; int B = 5; int C ; C = A + B; cout << C ; } 所以我想循环检查每个标记,并检查它是一个关键字还是一个数据类型。我使用java netBeans,代码如下 int k = 0; int l = 0; StringTokenizer Tokens; while ((
void main()
{
int A = 5;
int B = 5;
int C ;
C = A + B;
cout << C ;
}
所以我想循环检查每个标记,并检查它是一个关键字还是一个数据类型。我使用java netBeans,代码如下
int k = 0; int l = 0;
StringTokenizer Tokens;
while ((CurrentLine = ReadFile.readLine()) != null)
{
Tokens = new StringTokenizer(CurrentLine, " ", true);
for (int i = 0; Tokens.hasMoreTokens(); i++)
{
if (Tokens.nextToken().contains(KeyWord[k]))
{
jTextArea1.append(KeyWord[k] + "\n");
k++;
}
else if (Tokens.nextToken().contains(DataType[l]))
{
jTextArea2.append(DataType[l] + "\n");
}
}
}
首先,将
关键字
和数据类型
数组转换为数组列表
然后,做一些类似的事情:
while ((currentLine = ReadFile.readLine()) != null) {
String[] tokens= currentLine.split(" ");
for (String token : tokens) {
if (keyWord.contains(token)) {
jTextArea.append(token);
}
}
//rest of the code is similar
}
不,你的代码不起作用。当你在代币上迭代时,你从不增加k和l,它们一直保持
0
;这意味着您总是只检查第一个关键字和数据类型
建议
- 使用更简单的
而不是String.split()
,当您有多个分隔符并且需要比基本拆分更高级一点时,通常会使用StringTokenizer
StringTokenizer。由于您将
作为returnDelims
(第三个参数)传递,因此您也将空格作为令牌接收回来(我想这不是您想要的)。true
- 使用
来存储关键字/数据类型,而不是数组或ArrayList。与迭代数组或使用HashSet
相比,这将为您提供更好的性能。ArrayList.contains()
- 示例实现
HashSet<String> keyWords = new HashSet<String>( Arrays.asList(new String[] {"void", "main()"})); HashSet<String> dataTypes = new HashSet<String>( Arrays.asList(new String[] {"int", "float"})); String newLine = System.getProperty("line.separator"); while ((currentLine = readFile.readLine()) != null) { String[] tokens= currentLine.split(" "); for (String token : tokens) { if (keyWords.contains(token)) { jTextArea1.append(token + newLine); } else if (dataTypes.contains(token)) { jTextArea2.append(token + newLine); } } }
HashSet关键字=新HashSet( asList(新字符串[]{“void”,“main()”}); HashSet数据类型=新HashSet( asList(新字符串[]{“int”,“float”}); 字符串newLine=System.getProperty(“line.separator”); 而((currentLine=readFile.readLine())!=null){ String[]tokens=currentLine.split(“”); for(字符串标记:标记){ if(关键字.contains(令牌)){ jTextArea1.追加(令牌+换行符); }else if(数据类型.包含(令牌)){ jTextArea2.追加(令牌+换行符); } } }
公共静态void main(字符串gkadc[]){
String s=“天空是”;
StringBuilder sb=新的StringBuilder();
StringTokenizer t=新的StringTokenizer;
对于(int i=0;iGodness gracious learn Java命名约定,此代码不可读。请小心,您对索引变量(k和l)的使用非常奇怪,而且在if
/else if
条件中无意中消耗了太多的令牌。为什么不尝试设置关键字
而不是字符串[]关键字
?然后您会得到if(keywords.contains(token))
,更简洁了…只是一些提示。那么你的问题是什么?有错误吗?它不符合你的预期吗?谢谢兄弟的回答…你没有努力检查语法分析器、词法分析器等的理论。你到底有什么问题?你是最有帮助的darijan。我如何用JAVA声明arraylist。对不起,兄弟,因为我是Java新手非常感谢Ravi,如果你有时间,请给我写完整的代码,以便我能很好地理解。感谢兄弟我如何使用哈希集。感谢Ravi如果我想检查文件的每一行是否以分号结尾,该怎么办?检查if(currentLine.endsWith(“;”){//是的,它以分号结尾}在您的代码中,。我很乐意帮助您。请考虑接受答案。您可以用ReEX拆分字符串,但这是另一种方式,在这里,我们将通过迭代它来追加来自令牌字符串的每个元素。
HashSet<String> keyWords = new HashSet<String>(
Arrays.asList(new String[] {"void", "main()"}));
HashSet<String> dataTypes = new HashSet<String>(
Arrays.asList(new String[] {"int", "float"}));
String newLine = System.getProperty("line.separator");
while ((currentLine = readFile.readLine()) != null) {
String[] tokens= currentLine.split(" ");
for (String token : tokens) {
if (keyWords.contains(token)) {
jTextArea1.append(token + newLine);
} else if (dataTypes.contains(token)) {
jTextArea2.append(token + newLine);
}
}
}
public static void main(String gkadc[]) {
String s = "the sky is ";
StringBuilder sb = new StringBuilder();
StringTokenizer t = new StringTokenizer(s);
for(int i=0;i<( 2*t.countTokens() +1 );i++) {//imp line
sb.append(t.nextElement()+" ");
}
System.out.println( sb);
}
//out _ "the sky is"