2014-10-11 144 views
0

我的问题很简单。当输入== 1时发送x的值时,该方法应该将x的值添加到al ArrayList中。它这样做,但是当我尝试打印al的值时,它会打印出空的。Java ArrayList打印出空的?

第一类:

import java.util.Scanner; 

public class ToDo { 

    Scanner s = new Scanner(System.in); 
    Scanner g = new Scanner(System.in); 

    void start() { 
     IncompleteTasks incompletetasks = new IncompleteTasks(); 
     CompleteTasks completetasks = new CompleteTasks(); 
     AllTasks alltasks = new AllTasks(); 
     int input = 999; 
     String x = ""; 

     while (input != 0) { 

      System.out.println("What would you like to do? Type '0' to cancel"); 
      System.out.println(); 
      System.out.println("1. Add a task"); // done 
      System.out.println("2. View current tasks"); 
      System.out.println("3. Delete a task"); // done 
      input = s.nextInt(); 
      if (input == 1) { 
       while (!x.equals("quit")) { 
        System.out.print("Enter a task: (Type 'quit' to finish! "); 
        x = g.nextLine(); 
        if (x.equals("quit")) { 
         start(); 
        } 
        else { 
         incompletetasks.IncompleteTasksAdd(x); 
        } 

       } 

      } 
      else if (input == 2) { 
       System.out.println("\t1. All Tasks"); 
       System.out.println("\t2. Complete Tasks"); 
       System.out.println("\t3. Incomplete Tasks"); 
       input = s.nextInt(); 
       if (input == 1) { 
        alltasks.AllTasks(); 
       } 
       else if (input == 2) { 
        completetasks.CompleteTasks(); 
       } 
       else if (input == 3) { 
        incompletetasks.IncompleteTasksDisplay(); 
       } 
       else if (input == 0) { 
        System.exit(0); 
       } 

       else { 
        System.out.println("\t\t\t\tInvalid choice! Try again!"); 
        start(); 
       } 
      } 

      else if (input == 3) { 
       System.out.println("hello"); 
       x = s.nextLine(); 
       incompletetasks.IncompleteTasksDelete(x); 
      } 
      else if (input == 0) { 
       System.exit(0); 
      } 
      else { 
       System.out.println("\t\t\t\tInvalid choice! Try again!"); 
       start(); 
      } 
     } 
    } 
} 

二等:

import java.util.ArrayList; 
import java.util.Scanner; 

public class IncompleteTasks { 

    int counter = 0; 
    Scanner g = new Scanner(System.in); 
    ArrayList<String> al = new ArrayList<String>(); 

    void IncompleteTasksDisplay() { 
     System.out.println("----------------------------------------------------------"); 
     for (String f : al) { 
      counter++; 
      System.out.println(f); 
      // System.out.println(counter+". " +al.get(f)); 
     } 
     System.out.println("----------------------------------------------------------"); 

    } 

    void IncompleteTasksAdd(String x) { 
     al.add(x); 
     System.out.println("\tTask Added!"); 
    } 

    void IncompleteTasksDelete(String x) { 
     for (int k = 0 ; k < al.size() ; k++) { 
      if (al.get(k) == x) { 
       al.remove(x); 
      } 
     } 
    } 
} 

结果:

What would you like to do? Type '0' to cancel 

1. Add a task 
2. View current tasks 
3. Delete a task 
1 
Enter a task: (Type 'quit' to finish! Test 
Task Added! 
Enter a task: (Type 'quit' to finish! Test 1 
Task Added! 
Enter a task: (Type 'quit' to finish! Test 2 
Task Added! 
Enter a task: (Type 'quit' to finish! quit 
What would you like to do? Type '0' to cancel 

1. Add a task 
2. View current tasks 
3. Delete a task 
2 
1. All Tasks 
2. Complete Tasks 
3. Incomplete Tasks 
3 
---------------------------------------------------------- 
---------------------------------------------------------- 
What would you like to do? Type '0' to cancel 

1. Add a task 
2. View current tasks 
3. Delete a task 

我是新来的Java,所以不感到惊讶,如果我有坏的编码在其他部分或如果我失去了一些非常明显的东西。我感谢所有我能得到的帮助,因为我很难过,我不知道我做错了什么。

+0

我不是专家,但为什么不使用开关盒,而不是如果..如果.. – user562 2014-10-11 05:18:50

+0

我听说过一个开关盒,但我还没有学会它,但我的优先事项,所以我会学习它很快。感谢您的建议。 – Tacent 2014-10-11 05:20:04

+0

在调用nextInt()之后使用nextLine()。那么你将不需要两个Scanner实例。例如'input = s。nextInt(); s.nextLine();' – Niroshan 2014-10-11 05:42:40

回答

2

这条线:

IncompleteTasks incompletetasks = new IncompleteTasks(); 

声明一个本地变量incompletetasks,具体到当前呼叫start(),并将其初始化任务的新空单。

这条线:

start(); 

创建于start()一个新的,单独的调用,因此这将有一个单独的incompletetasks变量,并没有关于incompletetasks变量,你已经加入的一切任何信息。

start()应该不需要自行调用。

解决这个问题的最快方法是可以改变:

while (input != 0){ 

这样:

mainloop: while (input != 0) { 

(其中mainloop标签,给while循环的名称,这样你可以参考它),几乎每一次出现这个:

start(); 

这样:

continue mainloop; 

(意思大致是, “回去叫mainloop循环的开始”)。

A 更好解决方法是将您的方法拆分成更小的部分。这将允许更清晰的代码。一般来说,对于没有嵌套循环的方法来说通常是最好的(尽管有很多例外,所以不要把它当作硬性规则)。

+0

令人敬畏的家伙,解决了这个问题,我是新来的构造函数,但我有点明白你的意思,谢谢你的帮助! – Tacent 2014-10-11 05:30:23

+0

@相邻,如果你有解决方案,你应该接受答案。只需点击正确的标志。 – Roshan 2014-10-11 05:51:01