2016-02-07 118 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