検索機能を設計する – Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-008
Javaでデスクトップトップアプリ(予定&ToDo管理)を作るシリーズ8回目です。
今日は前回つくったタスクを保持し、タスクの検索を行うTaskBoxクラスを作っていきます。
JavaのLinkedListクラスを利用します。LinkedListは要素数が定まっていない配列のようなもので、プログラム実行中に随時データを格納できます。指定の要素を削除したり指定の場所に要素を挿入したりというのが簡単に行えます。
タスクを管理するboxを作るときは
LinkedList
box.add(Task task)
でリストの最後にタスクを追加できます。
今回のプログラムでは、List型のtasksという変数にLinkedListを作ることにしました。
List tasks = new LinkedList();
リスト内のすべてのタスク名を表示させるときは、Iteratorを使用して、
for(Iterator i = tasks.iterator(); i.hasNext();){
Task task = (Task) i.next();
System.out.println(task.getName());
}
という感じにしています。
検索を行うときは、検索したい条件のタスクを作成して、タスク内のフィールドを1つずつ比較していきます。
例えば、categoryが”趣味”のタスクを検索したいときは、
Task searchingTask =new Task(“”,””,null,”趣味”,””);
としてフィールドを比較し、条件に一致したものをmatchingTasksに追加していきます
dateの比較は、基本的にはDateクラスのmatchで行いますが、
「この1週間のタスクを確認したい」という時は、startWeekFlagをtrueにして、
DateクラスのmatchWeekを呼び出します。
とりあえず、見ていただきましょう。
[Box.java]
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Box {
private List tasks;
public Box(){
this.tasks = new LinkedList();
}
public void addTask(String name,String description,Date date,
String category,String context){
Task task = new Task(name,description,date,category,context);
this.tasks.add(task);
}
public Task getTask(String name){
for(Iterator i = this.tasks.iterator(); i.hasNext();){
Task task = (Task) i.next();
if(task.getName().equals(name)){
return task;
}
}
return null;
}
public List getTasks(){return this.tasks;}
public List search(Task searchingTask,Boolean startWeekFlag,
Boolean endWeekFlag){
List matchingTasks = new LinkedList();
for(Iterator i = this.tasks.iterator(); i.hasNext();){
Task task = (Task) i.next();
String category = searchingTask.getCategory();
if((category != null) && (!category.equals(""))
&& (!category.equals(task.getCategory())))
continue;
String context = searchingTask.getContext();
if((context != null) && (!context.equals(""))
&& (!context.equals(task.getContext())))
continue;
Boolean whether = searchingTask.getWhether();
if(( whether != null) && (!whether.equals(task.getWhether())))
continue;
Boolean finish = searchingTask.getFinish();
if(( finish != null) && (!finish.equals(task.getFinish())))
continue;
if(searchingTask.getDate() != null){
int y = searchingTask.getDate().getYear();
int m = searchingTask.getDate().getMonth();
int d = searchingTask.getDate().getDate();
if(startWeekFlag){
if(task.getDate() == null)
continue;
if(!task.getDate().matchWeek(y, m, d))
continue;
}else{
if(task.getDate() == null)
continue;
if(!task.getDate().match(y, m, d))
continue;
}
}
if(searchingTask.getFinishDate() != null){
int yf = searchingTask.getFinishDate().getYear();
int mf = searchingTask.getFinishDate().getMonth();
int df = searchingTask.getFinishDate().getDate();
if(endWeekFlag){
if(task.getDate() == null)
continue;
if(!task.getFinishDate().matchWeek(yf, mf, df))
continue;
}else{
if(task.getDate() == null)
continue;
if(!task.getFinishDate().match(yf, mf, df))
continue;
}
}
matchingTasks.add(task);
}
return matchingTasks;
}
}
テストしていきましょう。
[BoxTest.java]
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class BoxTest{
public static void main(String[] args){
Calendar calendar = Calendar.getInstance();
Date today = new Date(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE));
Date tomorrow = new Date(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE)+1);
Date nextWeek = new Date(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE)+7);
Date nextMonth = new Date(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DATE));
Box box =new Box();
box.addTask("取引先にメールを書く",
"打ち合わせのお礼メール",today,"仕事","オフィス");
box.addTask("部屋の掃除",
"机まわりを綺麗に",tomorrow,"家の用事","家");
box.addTask("コーヒー豆を買いに行く",
"ブラジルを200g",nextWeek,"趣味","");
box.addTask("旅行に行く","海外旅行",nextMonth,"趣味","");
box.addTask("ブログを書く","プログラミング記事",null,"趣味","");
System.out.println("今日のタスクを検索,
「取引先にメールを書く」が正解");
Task match1= new Task("","",today,"","");
List matchingTasks1 = box.search(match1,false,false);
if(!matchingTasks1.isEmpty()){
System.out.println("検索結果は、、、");
for(Iterator i1 = matchingTasks1.iterator(); i1.hasNext();){
Task task1 = (Task) i1.next();
System.out.println(task1.getName());
}
}else{
System.out.println("検索条件に当てはまるものはありません");
}
System.out.println("今週のタスクを検索,
「取引先にメールを書く」「部屋の掃除」が正解");
Task match2= new Task("","",today,"","");
List matchingTasks2 = box.search(match2,true,false);
if(!matchingTasks2.isEmpty()){
System.out.println("検索結果は、、、");
for(Iterator i2 = matchingTasks2.iterator(); i2.hasNext();){
Task task2 = (Task) i2.next();
System.out.println(task2.getName());
}
}else{
System.out.println("検索条件に当てはまるものはありません");
}
System.out.println("趣味カテゴリーのタスクを検索,「コーヒー豆を買いに行く」
「旅行に行く」「ブログを書く」が正解");
Task match3= new Task("","",null,"趣味","");
List matchingTasks3 = box.search(match3,false,false);
if(!matchingTasks3.isEmpty()){
System.out.println("検索結果は、、、");
for(Iterator i3 = matchingTasks3.iterator(); i3.hasNext();){
Task task3 = (Task) i3.next();
System.out.println(task3.getName());
}
}else{
System.out.println("検索条件に当てはまるものはありません");
}
}
}
[実行結果]
しっかりと動いています。
しかし、みなさんも気づかれたように、searchメソッドは混乱しています。
このコードには問題があります。それについては、また次回。
アプリ開発記の次の記事はこちら => UMLを書いて設計を見直す – Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-009