2013-05-19 5 views
1

Я пишу код для поиска по документу и поиска чисел и помещаю их в массив. Вот фрагмент документа:Scanner Skipping Numbers Java

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

Когда я запускаю программу NextWord пропускает над числом после ид и использует следующее слово. Мне нужно, чтобы он читал число, чтобы я мог поместить число в массив.

Пожалуйста, помогите. Спасибо!

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; 
} 
} 
} 

ответ

0

Ваш метод removeNextWord() жаден, т.е. это удаление номера, а также.

В вашей реализации вы сначала удалите все, что не является буквой перед словом, а затем само слово, а затем, наконец, все символы, следующие за словом, которые не являются буквами, которые затем удаляют номера идентификаторов.

Возможно, вам необходимо раскомментировать эту строку и переименовать: isLetter() - isToken().

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

EDIT: Исправьте вашу проверку условий для чисел. ch <= '1'.

+0

Когда я раскомментирую строку (ch <= '1') && (ch <= '9') || // разрешать числа, это не дает мне всего лишь одного слова. Я получаю все слова. – user2399625

+0

Совет: используйте 'Character.isLetterOrDigit (ch)' для реализации вашего нового метода isToken(). –

+0

Когда я раскомментирую, что строка nextword в моем основном становится следующим: «имя пользователя Sam movies id 1 Citizen Kane id». – user2399625

0

Если вы проверите ch> = 0 & & ch < = 9, это позволит только одноразрядные номера. Использование regex - хорошая идея

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

if(token.matches(regex)) 
// add the token to the array!