2014-10-11 3 views
0

Моя проблема проста. При отправке значения x при входе == 1, метод должен добавить значение 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

+0

Я слышал о случае с коммутатором, но я еще не узнал его, хотя это мой приоритет, поэтому я узнаю это очень скоро. Спасибо за предложение. – Tacent

+0

Потребление nextLine() после вызова nextInt(). Тогда вам не понадобятся два экземпляра сканера. например 'input = s.nextInt(); s.nextLine(); ' – Niroshan

ответ

2

Эта линия:

IncompleteTasks incompletetasks = new IncompleteTasks(); 

объявляет локальная переменнаяincompletetasks, относящиеся к текущему вызову start() и инициализирует его в новый пустой список задач.

Эта линия:

start(); 

создает новый, отдельный вызов start(), поэтому, который будет иметь отдельную incompletetasks переменного, и не будет иметь какую-либо информации о incompletetasks переменных, которую вы добавляли все, ,

Нет реальной причины, по которой start() необходимо будет позвонить себе.

Самый быстрый способ исправить это изменить:

while (input != 0){ 

к этому:

mainloop: while (input != 0) { 

(где mainloop является метка, давая в то время как однопетлевых имя так, чтобы вы можете сослаться на это) и почти на каждом этапе:

start(); 

к этому:

continue mainloop; 

(это означает, грубо говоря, «вернуться к началу цикла под названием mainloop»).

A Лучше Исправить это, чтобы разделить ваш метод на более мелкие части. Это позволит использовать более четкий код. В общем, обычно лучше всего, чтобы метод не имел вложенных циклов (хотя существует множество исключений, поэтому не принимайте это как жесткое правило).

+0

Удивительный чувак, исправил проблему, я новичок в конструкторах, но я как бы понимаю, что вы имеете в виду, спасибо за помощь! – Tacent

+0

@ Если у вас есть решение, вы должны принять ответ. Просто нажмите на правильный знак. – Roshan

Смежные вопросы