0

我们正在尝试将文件中的一行输入标记为 ADTList “令牌”。它正在读取信息,但列表中的第一个对象被设置为 NULL。我们已经尝试了许多更改,但无法弄清楚这是在哪里发生的。这是代码:

    //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

这是输出的快照,显示 NULL 对象位于第一个位置:

  • 原函数:a1 * ( b + c )
  • 标记化:null, a1, *, (, b, +, c, ),
  • 后缀中缀:
  • 后缀到中缀:

  • 原函数:( a * b + c

  • 标记化:null, (, a, *, b, +, c,
  • 后缀中缀:
  • 后缀到中缀:

这是 ADTList 类。这还不是全部,但它确实显示了我们的主项目调用的 add(T item) 方法:

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

4 回答 4

1

旁注:您有几个地方可以编写如下代码:

if (big_long_test) {
    do {
        something();
    } while(big_long_test);
}

将这些替换为

while (big_long_test) {
    do_something();
}

上面的代码不会在列表中添加 null。您的问题可能出在 ADTList 类中。

于 2012-12-12T21:17:09.197 回答
0

不知道如何实现 ADTList(在内部使用 ArrayList?)如果第一个位置的对象是空字符串,则 trim() 从文件中读取的 String 输入变量,以确保没有前导空格。如果输入有前导空格,您将向 ADTList 添加一个空值。

于 2012-12-12T21:18:11.037 回答
0

我认为问题在于 ADTList 类在调用构造函数时使列表的第一个成员为空。您提供的代码没有问题。

于 2012-12-12T21:19:25.630 回答
0

谢谢大家的意见。错误在于信息的打印。get() 函数拉动数组(位置-1),因此,我们拉动了 -1 位置。我非常感谢所提供的建议和代码精简。

于 2012-12-13T01:09:14.800 回答