Question

I am writing code to search through a document and find the numbers and put them into an array. Here is a piece of the document:

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

When I run the program nextword skips over the number after id and uses the next word. I need it to read the number so I can put the number in an array.

Please help. Thank you!

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;
}
}
}
Was it helpful?

Solution

Your removeNextWord() method is greedy i.e. it's removing the numbers as well.

In your implementation, you first remove everything that's not a letter before the word, then the word itself and then finally all the characters following the word that are not letters which then removes the id numbers as well.

Perhaps, you should uncomment this line and rename isLetter() to isToken().

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

EDIT: Please fix your conditional check for numbers. ch <= '1' is incorrect.

OTHER TIPS

When you check ch>=0 && ch<=9 it will only allow single digit numbers. Using regex is a good idea

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

if(token.matches(regex))
// add the token to the array!
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top