2017-03-31 10 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を見たいと思っています。これを行うには、可能な方法が1つあります。

JListにはListModel<E>インスタンスが付いています。これは、Eのインスタンスのリストを含むことができる汎用クラスです。

  • ToDoリスト(ToDoクラス、たとえば日付とtoDoテキストを含むクラス)の項目を表すクラスを作成します。
  • ToDoインスタンスの1つ以上のコンパレータを定義します。 1つは日付に基づいて、もう1つはテキストに、必要なものは何でも。
  • ToDoインスタンスでリスト(または別のコレクション)を作成し、コンパレータの1つを使用して並べ替えます。
  • リストに基づいたListModel実装を作成し、それをJListコンポーネントに設定します。 ListModel実装は、例えば、拡張子はAbstractListModelです。 example of sorted ListModel implementationも参照してください。
  • ToDosを意味のある方法でリストに表示するには、ToDoクラスのtoString()実装を作成します(JListはオブジェクトの文字列表現を取得するために呼び出します)。supply your own ListCellRenderer to the JList instance
  • 並べ替える必要がある場合は、ListModelの実装が正しく変更されていることを確認してから、notifies JListを変更してください。
1

なぜ、Date-> String>のSortedMapを使用しないのですか?

+0

これは道のりです –

+1

[パラレルコレクション](https://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/)ではなくクラスを使用してみませんか? – Michael

0

これを行うもう1つの方法は、マイケルが述べたように、オブジェクトを持つことです。それはあなたが望む変数、日付と文字列を格納します。将来的にはあなたが別の変数を追加したい場合は、簡単にちょうどあなたがオブジェクトを格納するリストを編集せずに、オブジェクトにこれを追加することができます。

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)を使用するのではなく、独自のソートを実装:


は今、あなたの質問に答えます。

リストを適切に並べ替えるためには、にComparable<ToDo>を実装する必要があります。私はこれを研究と実装のためにあなたに任せます。

+0

ありがとうございます。これは大いに役立ちます。私が今問題を抱えているのは、jListに新しいクラスToDoのオブジェクトを表示させる方法がわからないということです。 –

+0

私は 'JList'に慣れていませんが、プリミティブ配列(ToDo [])が必要な場合は' todos.toArray() 'を呼び出すことができます。 – Michael

+0

いいえ、私は文字列配列(String [])を必要とするjLists setListDataメソッドを使用します。文字列配列だけを表示したいと思うように、このクラスを表示するためのリストの取得方法についてはわかりません。 –

関連する問題