1

我正在编写代码来搜索文档并找到数字并将它们放入数组中。这是文件的一部分:

 username Sam movies id 1 Citizen Kane id 2  Vertigo id 3  Rules of the Game...

当我运行程序时,nextword 会跳过 id 之后的数字并使用下一个单词。我需要它来读取数字,以便可以将数字放入数组中。

请帮忙。谢谢!

package ArrayInversions;
import java.io.*;
public class Main{
public static void main (String[]args)
   throws FileNotFoundException{
    TextReader read = new TextReader("/Users/name/Desktop/movie-data.json");

    int[] ArraySam = new int[1000];
    int[] ArrayTerry = new int [1000];
    int[] ArrayDana = new int [1000];
    int temp;
    int i=0;

    String nextword;
    String name=null;
    String id="id";

    nextword=read.GetWord();
    while (nextword!=null){
        if (nextword.compareTo("username")==0){
            nextword=read.GetWord();
            name=nextword;
            System.out.println("name: "+name);
            nextword=read.GetWord();
            i=0;
        }
        System.out.println("* "+nextword+"="+id);

        if(nextword.compareTo(id)==0){
            nextword=read.GetWord();
            System.out.println(nextword);
            temp=Integer.valueOf(nextword);

            if (name.compareTo("Sam")==0){
                System.out.println("Sam");
                ArraySam[i]=temp;
                i++;
            }
            else if (name.compareTo("Terry")==0){
                System.out.println("Terry");
                ArrayTerry[i]=temp;
                i++;
            }
            else{
                System.out.println("Dana");
                ArrayDana[i]=temp;
                i++;
            }
        }
        nextword=read.GetWord();
            }
        }
        }

package ArrayInversions;
import java.util.*;
import java.io.*;

public class TextReader {

private Scanner read;
private String currline;

public TextReader(String filename){
try{
    currline = "";
    read = new Scanner(new File(filename));
}
catch (Exception ex){               
    System.out.println("File does not exist error: "+ex.toString());
}
}
private static boolean isLetter(char ch) {
    return ((ch >= 'A')&&(ch <= 'Z') ||
            (ch >= 'a')&&(ch <= 'z') ||
                // (ch <= '1')&&(ch <= '9') ||  //allows numbers?
            (ch == '-') || (ch == '\'')
            );  }
private String removeNextWord(String s) {
    //Returns the string with the first 'word' removed
    //First,  pull all non-letters off front
    while ((s.length()>0) && (isLetter(s.charAt(0))== false))
      s = s.substring(1);
    //Now, pull all letters off front
    while ((s.length()>0) && (isLetter(s.charAt(0))== true))
      s = s.substring(1);
    //Finally remove all non-letters off front
    while ((s.length()>0) && (isLetter(s.charAt(0))== false))
      s = s.substring(1);

    return s;                             //Return the resulting string
}
private String getNextWord(String s) {
    //Returns first 'word' of the string
    //First,  pull all non-letters off front
    String word="";
    while ((s.length()>0) && (isLetter(s.charAt(0))== false))
      s = s.substring(1);
    //Now, keep all letters as we pull them off the front
    while ((s.length()>0) && (isLetter(s.charAt(0))== true))
    {   word = word + s.charAt(0);  //build up the word
        s = s.substring(1);         //remove letters from string input
    }
    return word;                    //Return the resulting word string
}

public String GetWord(){
 // throws FileNotFoundException  //required throw line
{   String nextword;

    while ((currline != null)&&(currline.length()== 0)){
        if (read.hasNext())
          currline = read.nextLine().trim();
        else
          currline = null;
    }
    if (currline != null)
    {    nextword = getNextWord(currline);   //get word from front of line
         currline = removeNextWord(currline).trim();  //update the line w/o word
    }
    else
    {
         nextword = null;
    }
   return nextword;
}
}
}
4

2 回答 2

0

当您检查 ch>=0 && ch<=9 时,它只允许单个数字。使用正则表达式是个好主意

String regex="^[0-9]$";

if(token.matches(regex))
// add the token to the array!
于 2013-06-29T07:41:32.110 回答
0

您的removeNextWord()方法很贪心,即它也在删除数字。

在您的实现中,您首先删除单词之前不是字母的所有内容,然后是单词本身,最后是单词后面的所有不是字母的字符,然后也删除 id 编号。

也许,您应该取消注释这一行并重命名isLetter()isToken().

 (ch >= '0') && (ch <= '9') ||  // allow numbers

编辑:请修复您的数字条件检查。ch <= '1'是不正确的。

于 2013-05-19T21:19:09.117 回答