微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取用户输入并创建一个带有两个参数的列表

如何解决获取用户输入并创建一个带有两个参数的列表

我想根据用户输入创建一个 tasks 列表,如下面的代码所示:

class Task {
    private int start;
    private int finish;

    public Task(int start,int finish) {
        this.start = start;
        this.finish = finish;
    }

    public int getFinish() {
        return finish;
    }

    public int getStart() {
        return start;
    }

    @Override
    public String toString() {
        return "(" + getStart() + "," + getFinish() + ")";
    }
}

如您所见,一个 Task 由两个 int 组成,一个用于开始,一个用于结束。

然后我有一个类,选择具有特定条件的任务并返回任务列表:

class AS {

    public static List<Task> activitySelector(List<Task> tasks) {

        int k = 0;

        Set<Integer> result = new HashSet<>();

        result.add(0);

        Collections.sort(tasks,Comparator.comparingInt(Task::getStart));

        for (int i = 1; i < tasks.size(); i++) {
            if (tasks.get(i).getStart() >= tasks.get(k).getFinish()) {
                result.add(i);
                k = i;
            }
        }

        return result.stream().map(tasks::get).collect(Collectors.toList());

    }

然后我需要用户在终端中输入数字(开始、结束)来创建任务列表,但我一直在纠结如何获取用户输入并将每个输入以正确的方式排序。我知道我可以在本地声明列表,例如:

 List<Task> tasks = Arrays.asList(new Task(1,4),new Task(1,3),new Task(2,5),new Task(3,7),new Task(4,new Task(6,9),new Task(7,8));

但我不知道如何根据用户输入创建 List<Task>。关于如何实现这一目标的任何想法?

解决方法

public static List<Task> readInput() {
    List<Task> tasks = new ArrayList<Task>();
    Scanner sc = new Scanner(System.in);
    int number_of_tasks = sc.nextInt();
    for(int i = 0; i < number_of_tasks; i++) {
        int start = sc.nextInt();
        int finish = sc.nextInt();
        tasks.add(new Task(start,finish));
    }
    return tasks;
}

为什么不试试这个?

,
public static RuntimeException createException(String nextLine,RuntimeException exception) {
    return new RuntimeException("invalid input line ["+ nextLine + "]; must be comma seperated start and finish times",exception);
}

public static List<Task> getTaskListUserInput() {
    System.out.println("Please enter tasks as comma seperated start and finish times");
    System.out.println("One task each line");
    System.out.println("For example: 12,20");
    System.out.println("Empty line will be treated as end of input");
    System.out.println("-----------------");

    List<Task> taskList = new ArrayList<>();

    Scanner scanner = new Scanner(System.in);

    String nextLine = scanner.nextLine();

    while (!nextLine.isEmpty()) {
        String[] times = nextLine.split(",");
        if (times.length != 2) {
            throw createException(nextLine,null);
        }
        try {
            int start = Integer.parseInt(times[0]);
            int finish = Integer.parseInt(times[1]);

            Task task = new Task(start,finish);

            taskList.add(task);
        } catch (ArrayIndexOutOfBoundsException | NumberFormatException exception) {
            throw createException(nextLine,exception);
        }

        nextLine = scanner.nextLine();
    }

    System.out.println("-----------------");

    return taskList;
}

用法:

public static void main(String[] args) {
    List<Task> taskList = getTaskListUserInput();
    System.out.println(taskList.size());
}
Please enter tasks as comma seperated start and finish times
One task each line
For example: 12,20
Empty line will be treated as end of input
-----------------
1,4
7,10

-----------------
2

Process finished with exit code 0
,

这是一个使用 BufferedReader 的快速方法:

    List<Task> tasks = new ArrayList<>();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line;
    while (!((line = br.readLine()).isEmpty())){
        StringTokenizer st = new StringTokenizer(line);
        int startInt = Integer.parseInt(st.nextToken());
        int endInt = Integer.parseInt(st.nextToken());
        // Task is the same Task class you provided
        tasks.add(new Task(startInt,endInt));
    }

    br.close();
    System.out.println(tasks);

用户将在每行输入两个由空格分隔的数字,最后输入一个空行。

示例输入

4 6
8 9


示例输出

[(4,5),(6,7)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。