待办事项列表和排序

To-do list and sort

我正在做我的学校项目,我的一个想法是通过询问

来创建一个待办事项列表

第 1 步。输入您的活动 Step 2. 用户输入 第 3 步。输入您的截止日期(十进制格式) Step 4. 用户输入 第 5 步。询问用户是否要输入更多事件(1 表示是,0 表示否) Step 6. 当用户没有输入 0 时,重复 1-5 的过程 然后我希望我的代码根据我的截止日期对我的事件进行排序。我在 Whosebug 上找到了一些适用于我的程序的东西,但我遇到了以下问题:

  1. 当我运行我的程序系统显示: 注意:Main.java 使用未经检查或不安全的操作。 注意:使用 -Xlint:unchecked 重新编译以获取详细信息。 我不知道为什么,希望能解决这个问题。
  2. 当我运行我的程序时,第2步在输入第一个事件后被跳过 这意味着只输入了 1 个事件和截止日期,那么您只能输入截止日期。
  3. 我不知道这行代码是如何工作的 Collections.sort(sortedList, Comparator.comparing(s -> arr_dues[stringListCopy.indexOf(s)])); 如果我提交这个,我应该能够理解。如果可以的话,能否请您解释一下比较器或删除 link 视频以便我可以观看以理解这个概念。

非常非常非常感谢。这是我的代码。

static void to_do() {
    int more = -1;
    String event;
    double due = 0.0;
    Scanner in = new Scanner(System.in);
    ArrayList<String> events = new ArrayList <String>();
    ArrayList<Double> dues = new ArrayList <Double>();
    System.out.println("To-Do List Generator:");
    while (more != 0) {
      System.out.println("Please enter your event");
      event = in.nextLine();
      events.add(event);
      System.out.println("Please enter the due date in decimal form");
      due = in.nextDouble();
      dues.add(due);
      System.out.println("Do you have more events to add? Yes enter 1, No enter 0");
      more = in.nextInt();
    }
    System.out.println("Entry Successful. Here is your to do list");
    String[] arr_events = new String[events.size()];
    double[] arr_dues = new double[dues.size()];
    for (int i=0; i<events.size();i++){
      arr_events[i] = events.get(i);
    }
    for (int i=0; i<dues.size();i++){
      arr_dues[i] = dues.get(i);
    }
    final List<String> stringListCopy = Arrays.asList(arr_events);
    ArrayList<String> sortedList = new ArrayList(stringListCopy);
    Collections.sort(sortedList, Comparator.comparing(s -> arr_dues[stringListCopy.indexOf(s)]));
    String[] returnarr = new String[stringListCopy.size()];
    Collections.sort(dues);
    for (int i = 0; i<stringListCopy.size(); i++) {
      returnarr[i] = sortedList.get(i);
    }
    for (int i = 0; i<arr_dues.length; i++) {
      System.out.print(returnarr[i] + ", Due: ");
      System.out.println(dues.get(i));
    }
  }
public static void main(String[] args) {
to_do();
}
  1. 标准用法为:

    List<String> sortedList = new ArrayList<>(stringListCopy)

  2. 这里的问题可能与处理换行有关。当您调用 in.nextInt() 时,它会从 System.in 中读取一个整数,但不会读取最后的换行符,然后由 in.nextLine() 读取。尝试打印您正在阅读的值,看看它在做什么。

  3. 阅读有关排序和 lambda 的标准教程。综上所述,Collections.sort取了一个ComparatorComparator 接口有许多用于创建比较器的静态方法。 Comparator.comparing 创建一个比较器来比较 Function 生成的值。 Function 是一个功能接口,所以它可以接受一个 lambda。您显示的语句可以解释为:使用表达式 arr_dues[stringListCopy.indexOf(s)].

    根据每个条目生成的值的自然顺序对 sortedList 集合进行排序

另请注意,更好的设计是将每个事件封装在一个对象中:

class Event {
    private final String name;
    private final LocalDate dueDate;
}

并且有一个事件列表:

List<Event> toDoList = new ArrayList<>();

集合和数组之间的复制真的没有必要。