ToDoItem,MyList&驱动程序类

时间:2015-10-16 07:02:52

标签: java class methods arraylist

以下是我的指示:

这项任务已经过期,我的教授说他会评论它以帮助我理解,但我认为他太忙了。它让我的灵魂感到烦恼,我无法做到这一点......我在这里......任何帮助都会很精彩。

待办事项列表

  • 你将分两个班。 ToDoItem.java(定义待办事项的数据类型)和MyList.java(允许用户输入数据,创建ToDoItems和管理ToDoItems的驱动程序)。
  • 为ToDoItem设计一个类。 ToDoItem跟踪你需要做的项目(作为一个字符串),它到期的日期(嗯,这是一个很好的方法吗?),该项目的优先级(1是高,2是中等, 3是低的,如果该项目已经完成或未完成。
  • 绘制出一个粗略的UML图表,说明这个类的外观以及这个类需要哪些方法。您必须在作业中加入此项。您可以使用像ArgoUML这样的CASE工具,或者您可以简单地手绘图并提交您的作业图片。
  • 您必须提供一个构造函数,该构造函数接受此类的参数以设置对象的默认状态。
  • 编写一个重载方法,以便用户可以通过int(1,2,3)或String(“high”,“medium”,“low”)设置优先级。
  • 然后,编写一个简单的菜单驱动程序,该程序允许用户创建ToDo项目,删除它们,查看它们全部未排序,并将它们标记为已完成。请参阅附件MyList.java以获得一个小框架,以帮助您的菜单系统更有条理。

ToDo Notes&提示

附加文件MyList.java是一个简单的命令行驱动的ToDo列表的基本框架。使用此作为ToDo分配的基础。此入门文件中有很多缺失,但它可以帮助您更快地启动和运行。

import java.util.ArrayList;
import java.util.Scanner;

public class MyList {

   public static ArrayList todoItems = new ArrayList();

   public static void main(String[] args) {

      while(true) {
         printMenu();
         processInput();
      }

   }

   public static void printMenu() {
      System.out.println("[a]dd an item");   
      System.out.println("[p]rint all");  
      System.out.println("[q]uit"); 
   }

   public static void processInput() {
      Scanner s = new Scanner(System.in);
      String input = s.next();

      if(input.equals("a")) {
         //addToDoItem();
      }
      else if(input.equals("p")) {
         //printAll();
      }
      else if(input.equals("q")) {
         System.exit(0);
      }
   }

   // implement rest of processInput methods here

}
  • 应将每个功能(如创建,查看,删除和标记读取)定义为方法,以便您的代码可以轻松阅读。
  • 您的ToDoItem类应该没有与其中的用户界面相关的代码。将您的用户界面代码与您的数据分开(此建议基于名为Model-View-Controller或MVC的模式)。这意味着您的ToDoItem类可能非常基本,并且使用main方法的“驱动程序”文件正在执行大部分工作。
  • 使用Array或ArrayList存储ToDoItems。通过该数据结构中的索引引用各个ToDoItems(打印所有ToDoItems时打印每个项目的索引)。
  • 创建ToDoItem后,除非标记为已完成,否则无法进行编辑。如果用户输入错误日期或错误拼写标题,则只能删除该项目,然后重新创建以进行修复。这是为了简化分配。 同样,将项目标记为完整/不完整是可以编辑的ToDoItem的唯一方面。无法编辑的对象称为不可变。

ToDo计划思考

我们将在本课程的几周内讨论以下几点。我现在包括这些项目,所以你可以开始考虑它们。

  • 如果我们希望按日期或优先级或两者对日期项目进行排序,该怎么办? - 不要写这个,只要想想我们如何做到这一点。

  • 是什么让一个ToDo -item小于,等于或大于另一个?

  • 我们正在编写大量代码来管理ToDoItems数组。如果有的话,我们可以简化这个吗?

我有一个关于该计划演示的视频: https://youtu.be/9eWkn7uOLs0

这是我到目前为止编写的代码。我遇到困难,无法解析我的约会并将其打印出来。

MyList.java

import java.util.Scanner;
import java.util.ArrayList;
import java.io.*;
import java.text.*;

public class MyList {

   public static ArrayList<ToDoItem> toDoItems = new ArrayList<>();
   public static Scanner k = new Scanner(System.in);
   private static String description;
   private static String dueDate;
   public static void main(String[] args) throws ParseException {

      while(true) {
         printMenu();
         processInput();
      } 
   }

   public static void printMenu() {
      System.out.println("[a]dd an item"); 
      System.out.println("[d]elete an item");
      System.out.println("[t]oggle complete");  
      System.out.println("[p]rint all");  
      System.out.println("[q]uit"); 
   }

   public static void processInput() throws ParseException{
      Scanner s = new Scanner(System.in);
      String input = s.next();

      if(input.equals("a")) {
         addToDoItem();
      }   
      else if(input.equals("d")) {
         //deleteToDoItem();
      }
      else if(input.equals("t")) {
        // toggleComplete();
      }      
      else if(input.equals("p")) {
         printAll();
      }
      else if(input.equals("q")) {
         System.exit(0);
      }      
   }

   public static ToDoItem addToDoItem() throws ParseException {
      ToDoItem newItem;
      newItem = null;

      System.out.print("Enter an item to add to list: ");
      String desc = k.nextLine();
      if(desc.trim().length()==0) return newItem;
      System.out.print("Enter Date (MM/dd/YYYY): ");
      String dueDate = k.nextLine();

      System.out.print("Enter priority between 1 and 3 (3 being the highest): ");
      String prior = k.nextLine();
      int p = Integer.parseInt(prior);

      if(dueDate.trim().length()==0){
         newItem = new ToDoItem(desc);
      }
      else { 
         newItem = new ToDoItem(desc, dueDate);
      }
      newItem.setPriority(p);

      return newItem;         

      //toDoItems.add(new ToDoItem(desc, p, dueDate));
   }

   public static void printAll() throws ParseException {  
      ToDoItem item = new ToDoItem();
      System.out.println(item);

      //ToDoItem task = newItem.get(i);         
      // ***************
      // You should not need to create ToDoItems here
      // This method should loop through your array and print out each item
      // Since you have a toString() method you can print the objects by passing
      //   them into like so inside of a loop System.out.println( item.get(i) ) 
      //for(int i = 0; i < newItem.size(); i++) {
       //  System.out.println(toDoItems.get(i));
     // }
        // for(ToDoItem myItem : toDoItems) {
         //ToDoItem myItem = toDoItems.get(i);
         //System.out.println(myItem);
        // System.out.println(myItem.getDescription()+" -"+myItem.getPriority()+"- ("+myItem.getDueDate()+")");
      }
   }   

   //public static void deleteToDoItem() {

   // **********
   // You won't need a loop here, you can directly 
   //  delete the item at the given index.
   // Prompt for an int, read in the int, then call item.remove(i);

         //System.out.print("Enter index of item to delete: ");
         //int delete = k.nextInt();
         //toDoItems.remove(i);  
  // } 

  // public static void toggleComplete() {
      ///// 
  // }  
//}

ToDoItem.java

import java.text.*;
import java.util.Date;
//import java.lang.NullPointerException;

public class ToDoItem {

   private String description;
   private Date dueDate;
   private int priority;
   DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);   

   public ToDoItem() {
   }
   public ToDoItem(String desc) {
      description = desc;
      dueDate = null;
      priority = 0;
   }
   public ToDoItem(String desccription, String dDate) throws ParseException {
      this.description = description;
      dueDate = df.parse(dDate.trim());
   }
   public String toString() {
      if(dueDate != null) {
         return( description + " -"+priority+"- " + "Date not Set");
      }
      else {
         return( description + " -"+priority+"- " + df.format(dueDate));
      }
   }
   public void setPriority( int prio) {
      if(prio<0) this.priority = 0;
      else if(prio > 3) this.priority = 3;
      else this.priority = prio; 
   }
   public int getPriority() {
      return this.priority;
   } 
   public void setDueDate(String date) throws ParseException {
      Date d = df.parse(date.trim());
      this.dueDate = d;
   }
   public String getDescription() {
      return description;
   }     
   public String getDueDate() {
      if(dueDate == null) return "";
      return df.format(dueDate);
   }            
}

2 个答案:

答案 0 :(得分:0)

如果您在解析和打印日期类型时遇到问题,这可能会对您有所帮助:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    String dateString = sdf.format(new Date());
    Date date = null;
    try {
        date = sdf.parse("10/16/2015");
    } catch (ParseException objcPException) {
        // TODO Auto-generated catch block
        objcPException.printStackTrace();
    }
    System.out.println(date);
    System.out.println(dateString);

您必须更改此方法:

 public ToDoItem(String desccription, String dDate) throws ParseException {
  this.description = description;
  dueDate = df.parse(dDate.trim());

} 对此:

 public ToDoItem(String desccription, String dDate) throws ParseException {
  this.description = description;
  dueDate = sdf.parse(dDate);

} 并在我的示例中将DateFormat切换为SimpleDateFormat。 也许你必须在解析之前首先验证输入的形式(MM / dd / yyyy)。

答案 1 :(得分:0)

替换以下代码

DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);

以下声明并尝试

SimpleDateFormat df = new SimpleDateFormat("MM/dd/YYYY");

因此,构造函数将使用此dateformat来解析输入。

dueDate = df.parse(dDate.trim());

当用户以格式(MM / dd / YYYY)显示日期并以字符串形式读取时,最好的方法是使用dateformat解析它。从(stackoverflow)检查以下类似示例。你可以运行它并检查。

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date);

希望它有所帮助。