Java语言识别器

时间:2012-02-13 03:32:33

标签: java

我被赋予了“实现和测试语言”识别器“对象”的作业,通过本文末尾定义的Java接口提供给你。语言识别器接受字符串并确定它们是否在语言。“

语言如下:

L = {a * b} union {ab *},或者用英语重述,L是(1)零或更多的所有字符串的集合,(a *)后跟ab,或者(2) a后跟零或多个bs(b *)。

我已经取得了一些进展,但我被困住了。

这是界面:

/** The Recognizer interface provides a recognizer for the
* language L below.
*
* Let Sigma = {a,b} = the input character set.
*
* Let L = {ab*} union {a*b} be the language (set of
* legal strings) recognized by this recognizer.
*
* Let S = s1s2...sn be the string of n characters already
* input by this recognizer.
*
* Recognizer constructor must ensure: S' = < >
*/
interface Recognizer {
/**
* require: c in Sigma
*
* ensure: S' = S ^ c
*
* param c
*/
public void nextChar(char c);
/**
* Checks if input string S is in language L.
*
* return (S in L)
*/
public boolean isIn();
/**
* ensure: S' = < >
*/
public void reset();
}

这是我的结构:

import java.util.*;

public class LanguageVector implements Recognizer {

    int element = 0;
    int a = 0;
    int b = 0;

    Vector<Character> v = new Vector<Character>();

    public void nextChar(char c) {
            v.add(c);
        }

    public boolean isIn(){
            boolean isTrue = true;
            for(int i=0;i<v.size();i++) {
                if (v.size() == 1){
                    if (v.firstElement() == 'a' || v.firstElement() =='b'){
                        isTrue = true;
                        }
                    else
                        isTrue = false;
                }
                else if (v.firstElement() == 'a'){
                        if (v.lastElement() == 'a')
                            isTrue = false;
                        else if (v.lastElement() == 'b')
                            while (v.elementAt(element)== 'a' ){
                                a++;
                                element++;
                                System.out.println(element);
                            }
                            while (v.elementAt(element)== 'b'){
                                b++;
                                element++;
                                System.out.println(element);
                                }
                            if (v.elementAt(element)!= 'b'){
                                isTrue = false;
                            }
                            else if (a > 1 && b > 1){
                                isTrue = false;
                            }
                            else
                                isTrue = true;
                    }
                else if (v.firstElement() == 'b'){
                        isTrue = false;
                        }
                else
                    isTrue = false;
            }
            return isTrue;
            }


    public void reset(){
                v.clear();
            }

}

这是我的测试课:

import java.util.*;

public class LanguageTester {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Recognizer r = new LanguageVector();

        r.nextChar('a');

        r.nextChar('a');

        r.nextChar('a');

        r.nextChar('b');

        if (r.isIn())
            System.out.println("string is in L");
        else
            System.out.println("string is not in L");
        System.out.println("End of test");
        r.reset();
    }
}

当我跑步时,我得到以下输出:

1
2
3
Exception in thread "main" 4
java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
    at java.util.Vector.elementAt(Unknown Source)
    at LanguageVector.isIn(LanguageVector.java:34)
    at LanguageTester.main(LanguageTester.java:18)

为什么会这样?

另外,我如何使用用户输入,将其转换为矢量,并在此结构中使用它?

请原谅我,如果这个问题过于冗长,我不知道如何在不留下重要细节的情况下缩小范围。感谢

2 个答案:

答案 0 :(得分:2)

何时发生?

当您尝试访问索引超过其长度的数组时,会发生超出范围的异常。 java数组的最大索引是(长度-1) 例如:

String [] stringArray = new String[10];
stringArray[10]
// the code above will produce an out of bounds exception, because the it bigger than length -1, which is 10 - 1 = 9.

如果您不知道数组的大小或长度,可以从stringArray.length了解它。

如何处理?

您应该确保您的程序不能访问索引大于length - 1的数组。 例如:

for(int i=0;i<stringArray.lenght;i++) {
    //write your code here
}

上述代码将保证stringArray永远不会超出其最大索引。

你的案例

在您的情况下,4 >= 4本身表示您正在尝试访问第5个元素,即elementAt(4),但是Vector的大小为4。

数组基于0索引,即如果长度为4,则数据为Vector [0],Vector [1],Vector [2],Vector [3]。 另请阅读this了解更多信息......

答案 1 :(得分:1)

问题出在isIn()方法中。您没有检查元素变量是否仍然低于v.size()。您只需继续递增它,以便下次应用程序访问v.elementAt(element);时,变量元素大于v的大小,因此它是一个ArrayOutofBounds异常。