Reputation: 15
We are trying to tokenize a line of input from a file into an ADTList "tokens". It is reading the information ok, but the first object in the list is being set to NULL. We have tried many changes but cannot figure out where this is occurring. Here is the code:
//method to covernt lines of input from a file to individual tokens
public static ADTList tokenizer(String input){
String aToken; //defining variable to create token
ADTList tokens = new ADTList(); //defining return variable
for (int i = 0; i < input.length(); i++){ //loop to iterate through input string
aToken = ""; //clearing variable to hold next string
if (input.charAt(i) == '(' || input.charAt(i) == ')' ||
operator(input.charAt(i))){ //testing for parenthesis or operator
aToken += input.charAt(i); //concatenating character to string
tokens.add(aToken); //adding new string to token list
}else if (Character.isLetter(input.charAt(i))){ //testing for variable letter
aToken += input.charAt(i);
i++; //moving to next character in string
if (i < input.length() && Character.isLetterOrDigit(input.charAt(i))){
do{ //loop to test for end of variable
aToken += input.charAt(i);
i++;
}while (i < input.length() && Character.isLetterOrDigit(input.charAt(i))); //end of variable condition
}
tokens.add(aToken);
i--; //decrementing counter variable
}else if (Character.isDigit(input.charAt(i))){ //testing for number
aToken += input.charAt(i);
i++;
if (i < input.length() && Character.isDigit(input.charAt(i))){
do{ //loop to test for end of variable
aToken += input.charAt(i);
i++;
}while (i < input.length() && Character.isDigit(input.charAt(i))); //end of digit condition
}
tokens.add(aToken);
i--;
}else{
//do nothing
}//end if
}//end loop
return tokens; //returns tokens list to main
}//endFunction
Here is a snapshot of the output showing the NULL object in the first position:
Postfix to Infix:
Original function:( a * b + c
Here is the ADTList Class. This is not all, but it does show the add(T item) method that is called by our main project:
public class ADTList<T> implements ListInterface<T>{
//defining internal variables to be used in interface class
private int numItems;
private T array[];
public ADTList(){
//create an empty array
array = (T[]) new Object [25];
//assign 0 to numItems
numItems=0;
}
public boolean isEmpty(){
// Determines whether a list is empty.
// Precondition: None.
// Postcondition: Returns true if the list is empty,
// otherwise returns false.
if (numItems==0){
return true;
}else{
return false;
}
}
public boolean isFull(){
// Determines whether a list is full.
// Precondition: None.
// Postcondition: Returns true if the list is full,
// otherwise returns false.
return numItems==array.length;
}
public int size(){
// Determines the length of a list.
// Precondition: None.
// Postcondition: Returns the number of items that are
// currently in the list.
return numItems;
}
public boolean add(T item){
// Adds an item to the end of list.
// Precondition: the item should be inserted in the list.
// Postcondition: If insertion is successful, it returns true,
// item is at the end of the list,
// Returns false if the list is full
if (isFull()){
return false;
}else {
array[numItems]=item;
numItems++;
return true;
}
}
Upvotes: 0
Views: 3057
Reputation: 15
Thank you all for the input. The error was in the printing out of the information. The get() function pulls array(position-1), therefore, we were pulling a -1 position. I do appreciate the suggestions and the code streamlining that was provided.
Upvotes: 0
Reputation: 3368
I think the problem is that the ADTList class makes the first member of the list null when the constructor is called. There is no problem with the code you provided.
Upvotes: 0
Reputation: 552
Not knowing the how ADTList is implemented (using an ArrayList internally?) if the object in the first position is an empty string then trim() the String input variable you read from the file to ensure there is no leading whitespace. If input has leading whitespace you will add an empty value to the ADTList.
Upvotes: 0
Reputation: 3225
Sidenote: You have several places where you write code like this:
if (big_long_test) {
do {
something();
} while(big_long_test);
}
replace these with
while (big_long_test) {
do_something();
}
The code above does not add a null to the list. Your problem is probably in the ADTList class.
Upvotes: 1