2017-03-31 58 views
2

我正在爲java類項目製作一個待辦事項列表。在jList中,我顯示一個日期和一個表示日期的字符串,以及當天需要完成的工作。我也希望能夠按照它們的日期對這些事件進行排序,因此應儘早出現的任務首先出現。我知道如何使用冒泡排序對日期列表進行排序,但我不知道如何將它應用到我的列表中,因爲每個項目都包含日期和字符串。這是迄今爲止的代碼。有誰知道我將如何按順序對日期進行排序,並將字符串附加到日期中。謝謝。使用多個元素對數組進行排序

public class ToDoListManager { 

    final int maxitems = 20; 
    int items = 0; 
    String[] toDoList = new String[20]; 
    Date[] Dates = new Date[20]; 

    String addItem(String toDo, Date date) { 
     if (items == maxitems) { 
      return ("No more Space"); 
     } else if (toDo.equalsIgnoreCase("") || (toDo == null) || (date == null)) { 
      return ("All fields required"); 
     } else if (items < maxitems) { 
      Dates[items] = date; 
      SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); 
      toDoList[items] = "On " + dt1.format(date) + " " + toDo; 
      items = items + 1; 
      return (toDo + " Was Added to the List"); 
     } 
     return null; 
    } 

    void Order(Date[] dates) { 
     Date temp; 
     boolean fixed = false; 
     while (fixed == false) { 
      fixed = true; 
      for (int i = 0; i < dates.length - 1; i++) { 
       if (dates[i].before(dates[i + 1])) { 
        temp = dates[i + 1]; 
        dates[i + 1] = dates[i]; 
        dates[i] = temp; 
        fixed = false; 
       } 
      } 

     } 
     System.out.println(dates); 

    } 

    String[] getItems() { 
     String[] displayList = new String[items]; 
     for (int i = 0; i < items; i++) { 
      displayList[i] = toDoList[i]; 

     } 

     return displayList; 

    } 
} 
+1

考慮從創建代表您的任務的對象開始,該對象包含日期和字符串。 – njzk2

+2

請勿使用[平行集合](https://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/)。定義一個'ToDo'類。 – Michael

回答

1

您在問題中提到了JList,因此我假設您想要查看已排序的TODO。以下是一種可能的方法:

JList由ListModel<E>實例支持。這是一個通用類,可以包含E的實例列表。所以接線一起一個可行的辦法是:

  • 創建一個代表在待辦事項列表(類待辦事項,具有包含如日期和TODO文本字段)一個項目的類。
  • 定義ToDo實例的一個或多個比較器 - 例如,一個基於日期,另一個基於文本,無論你需要什麼。
  • 用您的ToDo實例填充一個List(或另一個集合),並使用其中一個比較器對其進行分類。
  • 創建一個由列表支持的ListModel實現,並將其設置爲JList組件。 ListModel實現可以是例如AbstractListModel的擴展名。另請參閱example of sorted ListModel implementation
  • 要在列表中以有意義的方式顯示ToDos,請在ToDo類上創建toString()實現(JList將調用該實現以獲取對象的字符串表示形式),或者supply your own ListCellRenderer to the JList instance
  • 如果您需要重新排序,請確保您的ListModel實現在每次改變順序時都正確地對待JList。
1

爲什麼不使用SortedMap的Date-> String>?

+0

這是要走的路 –

+1

爲什麼不使用類而不是[parallel collections](https://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/)? – Michael

0

邁克爾提到的另一種做法是做一個對象。這將存儲你想要的變量,日期和字符串。如果在未來要再添變數,你可以很容易地只添加此對象,而無需編輯列表,你的對象存儲。

public class Todo { 

private Date date; 
private String info; 

public Todo(Date date, String info){ 
    this.date = date; 
    this.info = info; 
} 

public Date getDate() { 
    return date; 
} 
public void setDate(Date date) { 
    this.date = date; 
} 
public String getInfo() { 
    return info; 
} 
public void setInfo(String info) { 
    this.info = info; 
} 
} 
+0

[對象應該是不可變的](http://www.yegor256.com/2014/06/09/objects-should-be-immutable.html)。制定者沒有理由。 – Michael

0

這大約是我將如何構建應用程序。爲了簡潔,我省略了ordergetItems方法。

public class ToDoListManager { 

    private static class ToDo 
    { 
     public final String text; 
     public final Date date; 
     public ToDo(String text, Date date) 
     { 
      this.text = text; 
      this.date = date; 
     } 
    } 

    final int maxItems = 20; 
    final List<ToDo> todos = new LinkedList<>(); 

    String addItem(String text, Date date) { 
     if (todos.size() == maxItems) { 
      return ("No more Space"); 
     } else if (text == null || text.equalsIgnoreCase("") || date == null) { 
      return ("All fields required"); 
     } else if (todos.size() < maxItems) { 

      final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
      text = "On " + format.format(date) + " " + text; 

      todos.add(new ToDo(text, date)); 

      return (text + " Was Added to the List"); 
     } 
     return null; 
    } 
} 

你可以看到事情變得簡單多了。一旦你溝原始陣列贊成收藏工作,並開始使用類。


現在回答你的問題:不是實現自己的排序,可以使用Collections.sort(todos)

爲了適當地對您的列表進行分類,您需要ToDo來實施Comparable<ToDo>。我會把這個留給你去研究和實施。

+0

謝謝。這有很大幫助。我現在遇到的麻煩是我不確定如何讓jList顯示新類ToDo的對象。 –

+0

我對'JList'不熟悉,但是如果你需要一個原始數組(即ToDo []),那麼你可以調用'todos.toArray()'。 – Michael

+0

不,我使用需要一個字符串數組(String [])的jLists setListData方法。不確定如何獲得列表來顯示這個類,因爲它似乎只想顯示字符串數組。 –

相關問題