2015-07-30 2 views
1

Я совершенно новый для программирования и 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

"Не работает" - как? Вы должны дать короткие фрагменты кода, который вы попробовали, и сообщить нам, что именно с ними не работает. Вся программа действительно не имеет значения. Вам просто нужно предоставить минимальный код, который показывает вашу проблему. Две заметки: (1) лучше сохранить данные в качестве Даты с самого начала, а не конвертировать их при поиске. Введите данные и преобразуйте их перед сохранением в списке. (2) Рассмотрите использование «LocalDate» Java 8 вместо почтенного и проблемного «Дата». – RealSkeptic

+0

Спасибо, что сообщили мне. Я добавил код, который не работал, и добавил сообщение об ошибке, которое я получаю. Я также изменил код, чтобы использовать LocalDate вместо Date. – Ini

ответ

1

Из вашего примера:

// Возвращает текущую дату

Date todayDate = Calendar.getInstance().getTime(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK); 

У вас есть дата возвращения в формат строки, как показано ниже:

videos.add (новый InventoryRow («Парк юрского периода», «Обычный», «N», «30/07/2015"));

Теперь разница между текущим днем ​​и возвращения даты:

 Date todayDate = Calendar.getInstance().getTime(); 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK); 
     String currDateStr = dateFormat.format(todayDate); 
     String returnDateStr = "01/08/2015"; 
     Date returnDate = null; 
     try { 
      returnDate = dateFormat.parse(returnDateStr); 
      todayDate = dateFormat.parse(currDateStr); 
     } 
     catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     long diffInDays = (todayDate.getTime() - returnDate.getTime())/(24 * 60 * 60 * 1000); 
     if (diffInDays == 0) { 
      System.out.println("Video is due today!"); 
     } 
     else if (diffInDays > 0) { 
      System.out.println("Video is overdue :("); 
     } 
     else { 
      System.out.println("Video returned in advance :) "); 
     } 
+0

Спасибо, но проблема в том, что введенная строка в верхней части кода будет меняться в зависимости от ввода пользователя, поэтому мне нужно получить дату возврата из указанного InventoryRow в ArrayList. Будет ли это работать для этого? – Ini

+0

есть. Если строка даты возврата из 'InventoryRow' имеет формат' dd/MM/yyyy'. – Vignesh

+0

Но как изменить код, чтобы строка даты возврата не была установлена, но может измениться в зависимости от того, какое видео пользователь вводит в строке4? Каждое видео будет иметь другую дату возвращения, поэтому 30/07/2015 относится только к парку Юрского периода. Я знаю, что сейчас у меня есть только одна дата возвращения в моем списке массивов, но в будущем у меня будет больше. – Ini

0

Одна вещь, которую вы можете сделать, вместо того, чтобы пытаться скрывать «даты», - это преобразовать строки, которые представляют даты в числа. В этом случае вы можете разбить строку на целое число. Например:

class Example { 
    public static void main(String[] args) { 
     String Date = "07/30/2015"; 
     String[] DatesTxt = Date.split("/"); 
     int[] DatesInt = new int[3]; 
     for (int i = 0; i < DatesTxt.length; i++) { 
      DatesInt[i] = Integer.parseInt(DatesTxt[i]); 
     } 
     if (DatesInt[1] < 31) { 
      System.out.println("And look am comparing dates!"); 
     } 
    } 
} 

Надеюсь, это помогло :).

+0

Спасибо, но я очень заинтересован в преобразовании в даты и использовании их для сравнения, если это не единственный способ сделать это. Но я обязательно буду помнить об этом. – Ini

Смежные вопросы