我想要发生什么
输入= a,b,c,d
输出= a,b,c,d
输入(不终止程序)= e,f,g,h
输出= e,f,g,h
发生了什么
输入= a,b,c,d
输出= a,b,c,d
输入(不终止程序)= e,f,g,h
output =“empty”
代码
主要
之外public static ArrayList<String> alpha = new ArrayList<String>();
采用不同的方法
alpha.add("string"); //string contains an element which is changed after each loop
主要是在打印结果后
alpha.clear();
alpha = new ArrayList<String>();
然后我问用户是否要输入不同的文本,并且当它返回空列表时。另请注意,当我不包含.clear时,它只会重复旧输出。
编辑:
public static void startDFA(List<String> listDFA){
for (index = 0; index<size; index++){
String currString = listDFA.get(index);
int sizeCurrString = currString.length();
if (currString.indexOf('{') != -1 || currString.indexOf('}') != -1 ){
//System.out.println("curly");
curly++;
}
if (curly <= 2){
Q.add(currString);
}
if (curly > 2 && curly <5){
sigma.add(currString);
}
//System.out.println(index);
//System.out.println(listDFA.get(index));
}
printVal();
}
public static void printVal(){
System.out.println("The states (Q) are: ");
System.out.println(Q);
System.out.println("The elements (Sigma) are: ");
System.out.println(sigma);
}
public static void main(String[] args){ // MAIN
boolean recur = true;
while (recur){ //Reiterates question
System.out.println("Start? 'y' or 'n'"); //Ask user to start program
Scanner reply = new Scanner(System.in);
String strRep = reply.nextLine();
if (strRep.compareTo("y")==0){
System.out.println("Started");
System.out.println("Please enter a encoded DFA: "); //Ask user for DFA
String DFA = reply.nextLine();
System.out.println("You've entered: " + DFA ); //Reiterates string user inputed
List<String> listDFA = Arrays.asList(DFA.split("\\s*,\\s*"));
size = listDFA.size();
startDFA(listDFA);
}
else{
System.out.println("End of program.");
recur = false;
}
}
}
答案 0 :(得分:1)
我不确定您的 if子句,因为您的输入是a,b,c,d或e,f,g,h并且您正在寻找大括号(&amp; )。我在您的代码中看到的一个问题是您增加卷曲变量计数,并且它在首次运行时工作正常,因为当您第一次运行应用程序 curly = 0 时。但是在完成第一次运行之后,你的卷曲将大于零,或者可以说第一次运行的可能性达到最大值。您应该在startDFA方法的start开始之前重置curly = 0,如下所述,或者在调用startDFA之前在main方法中设置curly = 0。除此之外,你还需要清除你的Q,sigma,翻译,开始&amp;完成arraylist如果需要与卷曲。最好的地方是做所有这些重置和清除是在循环内的startDFA方法内。
public static void startDFA(List<String> listDFA){
curly = 0
for (index = 0; index<size; index++){
}
}
答案 1 :(得分:1)
只是声明很多静态变量是不好的编码风格 - 你看到了会发生什么。声明一个类,将带有相关信息的变量放入字段(这里:2个列表)。在最里面的范围内声明其他变量(这里:卷曲)。不要声明无用的变量(这里:size,sizeCurrString)。使用for语句的compact。
public class Curly {
private List<String> q = new ArrayList<>();
private List<String> sigma = new ArrayList<>();
public void startDFA( List<String> listDFA){
int curly = 0;
for( String curr: listDFA ){
if( curr.indexOf('{') != -1 ||
curr.indexOf('}') != -1 ){
curly++;
} // maybe: else
if (curly <= 2){
q.add(curr);
} else if( curly <5 ){
sigma.add(curr);
}
}
}
public void printVal(){
System.out.println("The states (Q) are: ");
System.out.println(q);
System.out.println("The elements (Sigma) are: ");
System.out.println(sigma);
}
}
主要是你做的:
Curly curly = new Curly();
curly.startDFA( listDFA );
curly.printVal();
如果程序需要增长,请添加更多方法(例如List<String> getQ
)。 避免静态。