2016-02-07 4 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 (новый FileWriter (имя_файла, true)); в методе 'sortList()'? – mks

+0

Я бы хотел просто выполните задачи, отсортированные, когда пользователь выбрал случай 3. Я думаю, ему не пришлось бы сортировать их в фактическом файле, просто верните их отсортированные – Rassisland

ответ

3

Проблема заключается в отсутствии инструкции break в вашем switch, которая вызывает метод deleteTasks() после звонка sortList(). Измените код этого и он должен работать нормально:

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, или он будет дублировать список при каждом его вызове. Что-то вроде этого sould сделать это:

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(); 

EDIT: Для того, чтобы распечатать отсортированный список там несколько вещей, которые вы могли бы сделать. Самый простой способ, вероятно, будет добавить вызов метода 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(); 
} 

EDIT 2: Самый простой способ получить все Tasks с пустым DueDate на дно при сортировке является чан е метод 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

удивительный, это отлично работает! Я просто заметил две копии всего, спасибо за обновление. Одна вещь, которую я до сих пор не получаю, заключается в том, что когда я выбираю Case 3, метод сортировки, он сортирует задачи, но не появляется, пока я не выберу Case 1 еще раз. Как я могу это получить, когда я отсортирую его, тогда появится – Rassisland

+0

@Rassisland Отредактировано мое решение :) – scsere

+0

Опять же, спасибо за помощь! Я ценю это! – Rassisland

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