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

标签 java list arraylist

刚接触这个网站,一般都是用 java 编码。我从去年的类(class)中获得了大约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;
    }
}

我意识到这可能是一个非常菜鸟的问题,也许我从中做了比我必须做的更多的交易。但我真的很想了解我在做什么,而这位新教授与我的老教授相比,在帮助理解方面稍差一些。因此,我来​​这里是为了寻求帮助,而不是为了有人做我的工作!因此,任何帮助将不胜感激,我可以根据需要提供任何其他信息。如果需要或更容易的话,甚至可以发布实验室的照片。

最佳答案

原始答案

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

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:

关于Java:2 个类,一个主类(测试器)和其他类(方法)。从测试器获取输入并传递给其他类的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52238801/

相关文章:

java - 需要 JButton 事件支持

java - 我可以 "start over"一个 java 扫描器吗?

java - 什么是对 LinkedList 内部元素的(缓慢)访问

java - 如何迭代数组列表中的最后 5 个值

c# 从 ArrayList 获取对象属性

java - 如何在java中浏览文件夹?

r - 使用所有因素(包括缺失因素)合并拆分的 xts 列表

python - 如何在没有任何排序函数的情况下按字母顺序对字符串数组进行排序? Python

python - 仅将非空列表转换为列表列表中的元组

java - 如何将原始 JSON 作为来自 Restful 服务的响应传递?