Я совершенно новый для программирования и Java, поэтому извините любые глупые ошибки и действительно ужасный код (я понятия не имею, как заказать/форматировать). Мне было поручено составить список видеороликов с тремя функциями: списком, арендой и проверкой. У меня есть ArrayList, который содержит текущий список доступных видеороликов. Под функцией проверки я хочу иметь возможность преобразовать строку returndate в Date, а затем сравнить ее с сегодняшней датой. Если returndate и сегодняшняя дата равны, я хочу вернуть сообщение с сообщением: «Видео должно быть сегодня», и если returndate прошло (раньше сегодняшней даты), я хочу вернуть сообщение, в котором говорится: «Видео просрочено».Преобразование строк в даты и сравнение в ArrayList Java
Я изучал, как преобразовать строки в даты и наоборот, и пробовал весь день использовать это и многое другое, чтобы попытаться заставить его работать, но я просто не могу заставить его работать. Я знаю, что есть много подобных вопросов, которые были заданы и ответили, но я пробовал следовать за ними, и он не работает. Любая помощь могла бы быть полезна. Как я уже говорил, я новичок, поэтому извиняюсь за любую глупость.
Всего программный код:
import java.text.DateFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.*;
class InventoryRow {
private String name;
private String type;
private Character availability;
private String returndate;
public InventoryRow(String name, String type, Character availability, String returndate) {
this.name = name;
this.type = type;
this.availability = availability;
this.returndate = returndate;
}
public String getReturndate() {
return returndate;
}
public void setReturndate(String returndate) {
this.returndate = returndate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Character getAvailability() {
return availability;
}
public void setAvailability(Character availability) {
this.availability = availability;
}
public String toString() {
return name + " " + type + " " + availability + " " + returndate;
}
}
public class InventorySort {
public static void main(String[] args) throws ParseException {
List<InventoryRow> videos = new ArrayList<InventoryRow>();
videos.add(new InventoryRow("Casablanca", "Old", 'Y', null));
videos.add(new InventoryRow("Jurassic Park", "Regular", 'N', "2015-07-30"));
videos.add(new InventoryRow("2012", "Regular", 'Y', null));
videos.add(new InventoryRow("Ant-Man", "New", 'Y', null));
LocalDate dateReturn = LocalDate.now().plusDays(3);
LocalDate dateToday = LocalDate.now();
Scanner input = new Scanner(System.in);
// Output the prompt
System.out.println("Do you want to list (l), rent (r) or check (c)?");
// Wait for the user to enter a line of text
String line = input.nextLine();
// List, rent and check functions
// List function
if (line.equals("l")) {
// //////////////////////////// Sort function
Collections.sort(videos, new Comparator<InventoryRow>() {
public int compare(InventoryRow o1, InventoryRow o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (InventoryRow inventory : videos) {
System.out.println(inventory);
}
// /////////////////////////// Rent function
} else if (line.equals("r")) {
System.out.println("Which video would you like to rent?");
String line2 = input.nextLine();
// /////////////////////////// Search through ArrayList
boolean foundIt = false;
for (InventoryRow ir : videos) {
if (line2.equals(ir.getName()) && ir.getAvailability() == 'Y') {
foundIt = true;
break;
}
}
if (foundIt) {
System.out.println("Video available to rent! Would you like to rent this video?");
String line3 = input.nextLine();
if (line3.equals("Yes")) {
System.out.println("You have rented this video until " + dateReturn + ".");
for (InventoryRow ir : videos) {
if (ir != null && line2.equals(ir.getName())) {
ir.setAvailability('N');
ir.setReturndate(dateReturn.toString());
// //////////////// Just to test if this works
for (InventoryRow inventory : videos) {
System.out.println(inventory);
}
}
}
} else {
System.out.println("You have not rented this video.");
}
} else {
System.out.println("Video unavailable to rent.");
}
// /////////////////////////// Check function
} else if (line.equals("c")) {
System.out.println("Which video would you like to check is in the inventory?");
String line4 = input.nextLine();
// /////////////////////////// Search through ArrayList
boolean foundIt = false;
for (InventoryRow ir : videos) {
if (line4.equals(ir.getName())) {
foundIt = true;
break;
}
}
if (foundIt) {
System.out.println("Video found!");
for (InventoryRow ir : videos) {
LocalDate returnDate = LocalDate.parse(ir.getReturndate());
if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
System.out.println("Video due for return today.");
} else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
&& returnDate.isBefore(dateToday)) {
System.out.println("Video is overdue!");
} else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
System.out.println("Video is due for return on: " + ir.getReturndate());
}
}
} else {
System.out.println("Video not found. Please see the inventory below.");
Collections.sort(videos, new Comparator<InventoryRow>() {
public int compare(InventoryRow o1, InventoryRow o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (InventoryRow inventory : videos) {
System.out.println(inventory);
}
}
// /////////////////////////// If anything else is entered
} else {
System.out.println("The only options are to list (l), rent (r) or check (c).");
}
}
}
Это немного, что не работает, и я не знаю, почему:
if (foundIt) {
System.out.println("Video found!");
for (InventoryRow ir : videos) {
LocalDate returnDate = LocalDate.parse(ir.getReturndate());
if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
System.out.println("Video due for return today.");
} else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
&& returnDate.isBefore(dateToday)) {
System.out.println("Video is overdue!");
} else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
System.out.println("Video is due for return on: " + ir.getReturndate());
}
}
Это сообщение об ошибке я получаю:
Exception in thread "main" java.lang.NullPointerException: text
at java.util.Objects.requireNonNull(Objects.java:228)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1846)
at java.time.LocalDate.parse(LocalDate.java:400)
at java.time.LocalDate.parse(LocalDate.java:385)
at InventorySort.main(InventorySort.java:141)
"Не работает" - как? Вы должны дать короткие фрагменты кода, который вы попробовали, и сообщить нам, что именно с ними не работает. Вся программа действительно не имеет значения. Вам просто нужно предоставить минимальный код, который показывает вашу проблему. Две заметки: (1) лучше сохранить данные в качестве Даты с самого начала, а не конвертировать их при поиске. Введите данные и преобразуйте их перед сохранением в списке. (2) Рассмотрите использование «LocalDate» Java 8 вместо почтенного и проблемного «Дата». – RealSkeptic
Спасибо, что сообщили мне. Я добавил код, который не работал, и добавил сообщение об ошибке, которое я получаю. Я также изменил код, чтобы использовать LocalDate вместо Date. – Ini