首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语言识别器

Java语言识别器
EN

Stack Overflow用户
提问于 2012-02-13 11:32:33
回答 2查看 787关注 0票数 2

我的任务是“实现和测试语言”识别器“对象,它是通过本文末尾定义的Java接口提供给您的。语言识别器接受字符串,并确定它们是否在该语言中。”

语言如下:

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

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

下面是界面:

代码语言:javascript
复制
/** 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();
}

这是我的结构:

代码语言:javascript
复制
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();
            }

}

下面是我的测试类:

代码语言:javascript
复制
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();
    }
}

当我运行时,我得到以下输出:

代码语言:javascript
复制
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)

为什么会发生这种情况?

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

如果这个问题太长,请原谅,我不确定如何在不遗漏重要细节的情况下缩小范围。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-13 11:44:05

当它发生时?

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

代码语言:javascript
复制
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中知道。

怎么处理呢?

你应该确保你的程序不会访问索引长度大于- 1的数组。例如:

代码语言:javascript
复制
for(int i=0;i<stringArray.lenght;i++) {
    //write your code here
}

上面的代码将保证stringArray永远不会被访问超过它的最大索引。

你的案例

在你的例子中,4 >= 4本身说你正在尝试访问第5个元素,即elementAt(4),不管你的向量大小是4。

数组是基于0索引的,也就是说,如果你的长度是4,你的数据将是向量,Vector1,Vector2,Vector3。另请阅读this以了解更多信息...

票数 2
EN

Stack Overflow用户

发布于 2012-02-13 11:41:26

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9255242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档