我被赋予了“实现和测试语言”识别器“对象”的作业,通过本文末尾定义的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)
为什么会这样?
另外,我如何使用用户输入,将其转换为矢量,并在此结构中使用它?
请原谅我,如果这个问题过于冗长,我不知道如何在不留下重要细节的情况下缩小范围。感谢
答案 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异常。