Java:2个类,一个Main(测试器)和其他类(方法)。从测试器获取输入并传递给其他类的ArrayList

时间:2018-09-08 19:41:34

标签: java list arraylist

该网站的新手,并且通常使用Java进行编码。我从去年的课程中获得了大约5个月的经验。另一半花在python上。这个学期我们已经到达了第二个实验室,我遇到了一个小问题,我的新教授拒绝提供帮助/指导。

实验室已描述。

制作一个包含2个课程的待办事项列表。一类(主测试器一类)接受所有IO,并提供所有输出。另一个类包含待办事项列表本身(数组列表),并提供了可供主类调用的方法。扫描器对象在主测试器类中。 arraylist在另一个类中。

以下输入命令是必需的。

列出,新建,更改,删除,退出。

程序基本上会提示该消息,以向您的待办事项列表中添加一些内容。加上整行。然后在执行操作时对其进行修改。

我当前的问题是关于如何从测试程序中获取输入并将其传递给另一个类以存储到arraylist中。我们已经完成了所有它们都在主类中的实验,我只是添加了Arraylist类的方法调用。但是,现在我们必须以这种方式进行操作,而让他们进行交流时遇到了麻烦。我想我只是某种构造函数错误或某些对象被错误引用。这是我所拥有的一小段。

(主测试器类)     导入java.util.Scanner;

public class ToDoTester
{

    public static void main(String[] args)
    {
    Scanner in = new Scanner (System.in);


    ToDo info = new ToDo();

    while(true)
    {
      System.out.println("* * * Start To Do List * * *");
      System.out.println("Enter a command (List, New, Change, Done) or Quit 
");   

      String x = in.next();


      if(x.equals("List"))
      {
         System.out.println(info.getList()); 
         //Print out the array list
      }

      else if(x.equals("New"))
      {
         //System.out.println(info.addList(addedListOption)); 
         //Add new thing to do to arraylist
      }

(带有方法的其他类)

public class ToDo {
    ArrayList<String> data = new ArrayLst<String>();

    ToDoTester scan = new ToDoTester();

    private String list;

    public void addList() {
         //tring takeIn = ToDoTester.scan.next();
         //data.add(scan.nextLine());
    }
    public String getList() {
        System.out.println(data.size());
        return list;
    }
}

我意识到这可能是一个非常棘手的问题,也许我可以从中获得更多收益。但是我真的很想了解我在做什么,而这位新教授与我的老教授相比,在帮助理解部门中要差一些。因此,我来​​这里是为了寻求帮助,而不是为了我的工作!因此,我们将不胜感激,可以根据需要提供其他信息。如有必要或更容易,甚至可以发布实验室图片。

2 个答案:

答案 0 :(得分:1)

原始答案

您做得不错,但您可能忘记了我们可以通过方法参数将对象传递给方法。

class ToDo {
    public void addToList(String newToDo) {
        data.add(newToDo);
    }
}

class ToDoTester {
    public static void main(String[] args) {
        ...
        } else if (x.equals("New")) {
            info.addToList(in.nextLine());
        }
    }
}

扩展答案

这是我如何执行任务的简化版本。

正如我在评论中提到的,还有改进的空间:我们可以用命令模式替换开关,可以将入口点与域类分开,可以更准确地处理异常,可以定制输出消息更详细地说明。

无论如何,首先查看一下,然后让我知道是否要查看增强版。

final class ToDoTester {
    private final Scanner reader = new Scanner(System.in);

    public static void main(String[] args) {
        final ToDo toDo = new ToDo();
        final ToDoTester toDoTester = new ToDoTester();

        final Scanner reader = toDoTester.getReader();

        while (true) {
            System.out.println("Enter a command (List, New, Change, Delete) or Quit:");

            switch (reader.nextLine()) {
                case "List":
                    toDoTester.display(toDo.list());
                    break;
                case "New":
                    toDo.add(toDoTester.readToDo());
                    break;
                case "Change":
                    final Pair<Integer, String> input = toDoTester.readInputToChange();
                    toDo.update(input.getKey(), input.getValue());
                    break;
                case "Delete":
                    toDo.remove(toDoTester.readIndex());
                    break;
                case "Quit":
                    return;
                default:
                    System.out.println("Incorrect choice, let's try again.");
            }
        }
    }

    public Scanner getReader() {
        return reader;
    }

    public void display(List<String> list) {
        IntStream.range(0, list.size())
                .mapToObj(i -> String.format("[%d] %s", i, list.get(i)))
                .forEach(System.out::println);
    }

    public Pair<Integer, String> readInputToChange() {
        return new Pair<>(readIndex(), readToDo());
    }

    public String readToDo() {
        System.out.println("Enter a to-do:");
        return reader.nextLine();
    }

    public int readIndex() {
        System.out.println("Enter the index of the to-do:");
        return Integer.valueOf(reader.nextLine());
    }

}

final class ToDo {
    private final List<String> list = new ArrayList<>();

    public void add(String toDo) {
        list.add(toDo);
    }

    public void remove(int position) {
        validatePosition(position);
        list.remove(position);
    }

    public void update(int position, String substitute) {
        validatePosition(position);
        list.set(position, substitute);
    }

    private void validatePosition(int position) {
        if (position < 0 || position >= list.size()) {
            // should be thrown an exception
            System.out.println("Incorrect input.");
        }
    }

    public List<String> list() {
        return new ArrayList<>(list);
    }

}

执行示例:

Enter a command (List, New, Change, Delete) or Quit:
List
Enter a command (List, New, Change, Delete) or Quit:
New
Enter a to-do:
first to-do
Enter a command (List, New, Change, Delete) or Quit:
List
[0] first to-do
Enter a command (List, New, Change, Delete) or Quit:
Change
Enter the index of the to-do:
0
Enter a to-do:
my first to-do
Enter a command (List, New, Change, Delete) or Quit:
List
[0] my first to-do
Enter a command (List, New, Change, Delete) or Quit:
Delete
Enter the index of the to-do:
0
Enter a command (List, New, Change, Delete) or Quit:
List
Enter a command (List, New, Change, Delete) or Quit:

答案 1 :(得分:1)

您的todo类必须具有arraylist和puplic方法,这些方法将string(用于add方法)或int(用于delete)或什么都没有(用于list)作为参数,并在arraylist上进行操作。您的ToDoTester类必须包含todo类的示例(ToDo info = new ToDo();)并在其循环中对其方法进行操作。希望有帮助