2016-02-07 115 views
0

我想用可比较的接口按日期排序用户输入的任务和日期列表。我有一个外部.txt文件中的任务,如果我正在访问正确的变量,有点困惑。该程序编译,但是当我尝试对任务进行排序时,它似乎删除了该文件的内容。这里是我的:实现可比较的java

public class DueDate implements Comparable<DueDate>{ 

    public String addedTask = ""; 
    public String enteredDueDate; 


    public DueDate(String addedTask, String dueDate){ 

     this.addedTask = addedTask; 
     this.enteredDueDate = enteredDueDate; 
    } 

    public String toString(){ 
     return addedTask+"\t"+enteredDueDate+"\t"; 
    } 

    @Override 
    public int compareTo(DueDate o) { 
     return this.enteredDueDate.compareTo(o.enteredDueDate); 
    } 
} 

public class Main { 

    public static String fileName = "/Users/eringray/Desktop/tasklistjava/src/javatask.txt"; 

    public static void main(String[] args) throws IOException { 

     int menuItem = -1; 
     while(menuItem != 0){ 
      menuItem = menu(); 
      switch (menuItem){ 
       case 1: 
        showTaskList(); 
        break; 
       case 2: 
        addTask(); 
        break; 
       case 3: 
        sortList(); 
       case 4: 
        deleteTasks(); 
        break; 
       case 0: 
        break; 
       default: 
        System.out.println("Invalid Input"); 

      } 
     } 
    } 



    static int menu(){ 
     int choice; 
     Scanner sc = new Scanner(System.in); 
     System.out.println("\n Task List Menu \n"); 
     System.out.println("0: Exit Menu"); 
     System.out.println("1: Show Tasks in List"); 
     System.out.println("2: Add Task to List"); 
     System.out.println("3: Sort Tasks by Due Date"); 
     System.out.println("4: Delete Tasks"); 
     System.out.println(); 
     System.out.println("Enter a choice: "); 
      choice = sc.nextInt(); 
      return choice; 
    } 

    static void showTaskList(){ 
     System.out.println("\nTask List\n"); 
     try { 
      Scanner inFile = new Scanner(new FileReader(fileName)); 
      String line; 
      int number = 1; 
      while(inFile.hasNextLine()){ 
       line = inFile.nextLine(); 
       System.out.println(number + ". " + line); 
       ++number; 
      } 
      System.out.println(); 
      inFile.close(); 
     } catch (FileNotFoundException ioe) { 
      System.out.println(ioe); 
     } 
    } 

    static void addTask(){ 
     System.out.println("\nAdd Task\n"); 
     try { 
      Scanner input = new Scanner(System.in); 
      PrintWriter outFile = new PrintWriter(new FileWriter(fileName, true)); 
      System.out.println("Enter a Task: "); 
      String addedTask = input.nextLine(); 
      System.out.println("Set Due Date for this Task(yyyy-mm-dd): "); 
      String dueDate = input.nextLine(); 
      outFile.println(addedTask + "\t" + dueDate); 
      outFile.close(); 
     } catch (IOException ioe) { 
      System.out.println(ioe); 
     } 
    } 
    static void sortList() throws IOException { 
     System.out.println("\nSorted List\n"); 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(fileName)); 
      BufferedWriter bw = new BufferedWriter(new FileWriter(fileName, true)); 
      ArrayList<DueDate> tasks = new ArrayList<DueDate>(); 
      String line = ""; 
      while((line = br.readLine()) != null) { 
       String[] values = line.split("\t"); 

       if(values.length == 2) { 
        String addedTask = values[0]; 
        String enteredDueDate = values[1]; 

        DueDate d = new DueDate(addedTask, enteredDueDate); 

        tasks.add(d); 
       } 
      } 

      Collections.sort(tasks); 

      for(int i = 0; i < tasks.size(); i++){ 
       DueDate date = tasks.get(i); 
       String lineText = date.toString(); 
       bw.write(lineText); 
       bw.newLine(); 
      } 

      br.close(); 
      bw.close(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


    } 
    private static void deleteTasks(){ 
     PrintWriter writer = null; 
     try { 
      writer = new PrintWriter(fileName); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     assert writer != null; 
     writer.print(""); 
     writer.close(); 
     } 

    } 

对不起,额外的代码,但认为它可以帮助你看看我想要做什么。任何建议都会很棒。我是Java新手,请耐心等待我!谢谢!

+0

是您的目标的任务进行排序该文件或只是为了输出它们排序给用户? – scsere

+0

你确定当前版本的代码是擦除文件?特别是你可以仔细检查行'BufferedWriter bw = new BufferedWriter(new FileWriter(fileName,true));''在'sortList()'方法中? – mks

+0

我想只是在用户选择案例3时对任务进行排序。我想不必在实际文件中对它们进行排序,只是将它们按顺序排序 – Rassisland

回答

3

问题是您的switch中缺少break声明,该声明在致电sortList()后调用deleteTasks()方法。更改您的代码这一点,它应该很好地工作:

int menuItem = -1; 
while(menuItem != 0){ 
    menuItem = menu(); 
    switch (menuItem){ 
     case 1: 
      showTaskList(); 
      break; 
     case 2: 
      addTask(); 
      break; 
     case 3: 
      sortList(); 
      break; //The missing break 
     case 4: 
      deleteTasks(); 
      break; 
     case 0: 
      break; 
     default: 
      System.out.println("Invalid Input"); 
    } 
} 

而且DueDate类的构造函数缺少enteredDueDate变量,因为该参数被命名为dueDate而不是enteredDueDate的分配。您应该将其更改为如下所示:

public DueDate(String addedTask, String enteredDueDate){ 
    this.addedTask = addedTask; 
    this.enteredDueDate = enteredDueDate; 
} 

因为您当前正在将成员变量赋值给它自己的值。 您还应该考虑更改sortList方法,尤其是BufferedWriter,否则每次调用时都会重复该列表。这样的高度重视和事做:

BufferedReader br = new BufferedReader(new FileReader(fileName)); 
ArrayList<DueDate> tasks = new ArrayList<DueDate>(); 
String line = ""; 
while((line = br.readLine()) != null) { 
    String[] values = line.split("\t"); 
    if(values.length == 2) { 
     String addedTask = values[0]; 
     String enteredDueDate = values[1]; 
     DueDate d = new DueDate(addedTask, enteredDueDate); 
     tasks.add(d); 
    } 
} 
Collections.sort(tasks); 
br.close(); 
//Changed it to not append but overwrite the old file so it only contains the sorted list 
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName, false)); 
for (DueDate date : tasks) { 
    String lineText = date.toString(); 
    bw.write(lineText); 
    bw.newLine(); 
} 
bw.flush(); 
bw.close(); 

编辑:要打印排序列表出来有一些事情可以做。 最简单的方法很可能是在showTaskList方法的调用追加到sortList方法这样

//... 
    bw.flush(); 
    bw.close(); 
    showTaskList(); 
} catch (FileNotFoundE 
    e.printStackTrace(
} 

结束或者你可以遍历ArrayList并打印出来是这样的:

//... 
    bw.flush(); 
    bw.close(); 
    for (int i = 0; i < tasks.size(); i++) { 
     DueDate dueDate = tasks.get(i); 
     System.out.println(i+". "+dueDate.toString()); 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

编辑2:最简单的方式与空DueDate让所有Tasks的底部整理是昌时E中的compareTo方法DueDate类:

@Override 
public int compareTo(DueDate o) { 
    return -this.enteredDueDate.compareTo(o.enteredDueDate); 
} 

就否定它使所有条目降序排序和那些空DueDate会在列表的末尾(它继电器在字符串如何在默认情况下相比)。
但是,如果您想使用Tasks而没有到期日期,您将在sortList方法中遇到问题,因为split("\t")方法将只返回长度为1的数组,并且您的if条件将失败。解决这个问题的方法之一是这样的:

//... 
while ((line = br.readLine()) != null) { 
    String[] values = line.split("\t"); 
    //To ensure it's still valid data 
    if (values.length >= 1 && values.length <= 2) { 
     String addedTask = values[0]; 
     String enteredDueDate; 
     //Check whether dueDate has a value or is empty 
     if (values.length == 1) 
      enteredDueDate = ""; 
     else 
      enteredDueDate = values[1]; 
     DueDate d = new DueDate(addedTask, enteredDueDate); 
     tasks.add(d); 
    } 
} 
//... 

或更紧凑的版本(不完全一样的东西)

//... 
while ((line = br.readLine()) != null) { 
    String[] values = line.split("\t"); 
    if (values.length >= 1 && values.length <= 2) 
     tasks.add(new DueDate(values[0], values.length == 1 ? "" : values[1])); 
} 
//... 

希望这有助于(:

+0

真棒,这工作太棒了!我只是注意到了所有内容的两个副本,感谢您的更新。有一件事我还没有得到的是,当我选择案例3,sortlist方法时,它正在对任务进行排序,但是直到我再次选择案例1时才显示出来。我如何得到它,所以当我排序它会显示然后 – Rassisland

+0

@Rassisland编辑我的答案:) – scsere

+0

再次,感谢您的帮助!我很感激! – Rassisland