我的任务是“实现和测试语言”识别器“对象,它是通过本文末尾定义的Java接口提供给您的。语言识别器接受字符串,并确定它们是否在该语言中。”
语言如下:
L= {a*b}联合{ab*},或用英语重申,L是(1)零个或多个as (a*)后跟a b,或(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)为什么会发生这种情况?
另外,我如何使用用户输入,将其转换为向量,并在此结构中使用它?
如果这个问题太长,请原谅,我不确定如何在不遗漏重要细节的情况下缩小范围。谢谢
发布于 2012-02-13 11:44:05
当它发生时?
当您尝试访问索引超过其长度的数组时,会发生越界异常。java数组的最大索引为(length -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中知道。
怎么处理呢?
你应该确保你的程序不会访问索引长度大于- 1的数组。例如:
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以了解更多信息...
发布于 2012-02-13 11:41:26
问题出在isIn()方法中。您不会检查元素变量是否仍然低于v.size()。您只需继续递增它,这样应用程序下一次访问v.elementAt(element);时,变量元素就会大于v的大小,所以这是一个ArrayOutofBounds异常。
https://stackoverflow.com/questions/9255242
复制相似问题