2014-10-11 95 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