待办事项列表和排序
To-do list and sort
我正在做我的学校项目,我的一个想法是通过询问
来创建一个待办事项列表
第 1 步。输入您的活动
Step 2. 用户输入
第 3 步。输入您的截止日期(十进制格式)
Step 4. 用户输入
第 5 步。询问用户是否要输入更多事件(1 表示是,0 表示否)
Step 6. 当用户没有输入 0 时,重复 1-5 的过程
然后我希望我的代码根据我的截止日期对我的事件进行排序。我在 Whosebug 上找到了一些适用于我的程序的东西,但我遇到了以下问题:
- 当我运行我的程序系统显示:
注意:Main.java 使用未经检查或不安全的操作。
注意:使用 -Xlint:unchecked 重新编译以获取详细信息。
我不知道为什么,希望能解决这个问题。
- 当我运行我的程序时,第2步在输入第一个事件后被跳过
这意味着只输入了 1 个事件和截止日期,那么您只能输入截止日期。
- 我不知道这行代码是如何工作的
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();
}
标准用法为:
List<String> sortedList = new ArrayList<>(stringListCopy)
这里的问题可能与处理换行有关。当您调用 in.nextInt()
时,它会从 System.in
中读取一个整数,但不会读取最后的换行符,然后由 in.nextLine()
读取。尝试打印您正在阅读的值,看看它在做什么。
阅读有关排序和 lambda 的标准教程。综上所述,Collections.sort
取了一个Comparator
。 Comparator
接口有许多用于创建比较器的静态方法。 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<>();
集合和数组之间的复制真的没有必要。
我正在做我的学校项目,我的一个想法是通过询问
来创建一个待办事项列表第 1 步。输入您的活动 Step 2. 用户输入 第 3 步。输入您的截止日期(十进制格式) Step 4. 用户输入 第 5 步。询问用户是否要输入更多事件(1 表示是,0 表示否) Step 6. 当用户没有输入 0 时,重复 1-5 的过程 然后我希望我的代码根据我的截止日期对我的事件进行排序。我在 Whosebug 上找到了一些适用于我的程序的东西,但我遇到了以下问题:
- 当我运行我的程序系统显示: 注意:Main.java 使用未经检查或不安全的操作。 注意:使用 -Xlint:unchecked 重新编译以获取详细信息。 我不知道为什么,希望能解决这个问题。
- 当我运行我的程序时,第2步在输入第一个事件后被跳过 这意味着只输入了 1 个事件和截止日期,那么您只能输入截止日期。
- 我不知道这行代码是如何工作的
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();
}
标准用法为:
List<String> sortedList = new ArrayList<>(stringListCopy)
这里的问题可能与处理换行有关。当您调用
in.nextInt()
时,它会从System.in
中读取一个整数,但不会读取最后的换行符,然后由in.nextLine()
读取。尝试打印您正在阅读的值,看看它在做什么。阅读有关排序和 lambda 的标准教程。综上所述,
根据每个条目生成的值的自然顺序对Collections.sort
取了一个Comparator
。Comparator
接口有许多用于创建比较器的静态方法。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<>();
集合和数组之间的复制真的没有必要。