完了
This commit is contained in:
6
.classpath
Normal file
6
.classpath
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/bin/
|
||||
17
.project
Normal file
17
.project
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Taskmanager</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
126
src/Main.java
Normal file
126
src/Main.java
Normal file
@@ -0,0 +1,126 @@
|
||||
import java.util.Scanner;
|
||||
|
||||
//アプリ起動クラス
|
||||
//画面制御用
|
||||
//実際の処理はTaskManagerへ委譲する
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
//キーボード入力用
|
||||
Scanner sc = new Scanner(System.in);
|
||||
//タスク管理クラス生成
|
||||
TaskManager manager = new TaskManager();
|
||||
//起動時にCSV読込
|
||||
manager.loadTasks();
|
||||
//メニュー処理開始
|
||||
showMenu(sc, manager);
|
||||
|
||||
sc.close();
|
||||
|
||||
}
|
||||
|
||||
// メニュー処理
|
||||
// 4が入力されるまでループ
|
||||
public static void showMenu(Scanner sc, TaskManager manager) {
|
||||
|
||||
//メニュー番号
|
||||
int menu = 0;
|
||||
|
||||
while (menu != 5) {
|
||||
|
||||
//タスク一覧表示
|
||||
manager.displayTasks();
|
||||
//メニュー表示
|
||||
displayMenu();
|
||||
|
||||
try {
|
||||
|
||||
//入力値を数値へ変換
|
||||
//数字以外の場合は再入力指示
|
||||
menu =Integer.parseInt(sc.nextLine());
|
||||
//メニュー実行
|
||||
executeMenu(menu, sc, manager);
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
|
||||
//1~4が入力された場合
|
||||
inputError(sc);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//メニュー表示
|
||||
public static void displayMenu() {
|
||||
|
||||
//行間調整
|
||||
System.out.println();
|
||||
System.out.print("[1] タスク追加 ");
|
||||
System.out.print("[2] 完了/未完了の切り替え ");
|
||||
System.out.print("[3] 削除 ");
|
||||
System.out.print("[4] ソート ");
|
||||
System.out.println("[5] 終了");
|
||||
|
||||
System.out.print("番号を入力してください > ");
|
||||
|
||||
}
|
||||
|
||||
//メニュー実行
|
||||
//入力された番号に応じて処理を呼び出す
|
||||
public static void executeMenu(int menu, Scanner sc, TaskManager manager) {
|
||||
|
||||
switch (menu) {
|
||||
|
||||
case 1:
|
||||
//タスク追加
|
||||
manager.addTask(sc);
|
||||
|
||||
break;
|
||||
|
||||
case 2:
|
||||
//状態切替
|
||||
manager.changeStatus(sc);
|
||||
|
||||
break;
|
||||
|
||||
case 3:
|
||||
//タスク削除
|
||||
manager.deleteTask(sc);
|
||||
|
||||
break;
|
||||
|
||||
case 4:
|
||||
|
||||
manager.sortTasks(sc);
|
||||
|
||||
break;
|
||||
|
||||
case 5:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
// 1~5以外の数値入力
|
||||
inputError(sc);
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 入力エラー
|
||||
// Enter入力後にメニューへ戻る
|
||||
public static void inputError(Scanner sc) {
|
||||
|
||||
System.out.println();
|
||||
System.out.println(
|
||||
"正しい番号を入力してください。Enterキーを押してください。");
|
||||
|
||||
sc.nextLine();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
64
src/Task.java
Normal file
64
src/Task.java
Normal file
@@ -0,0 +1,64 @@
|
||||
//タスク情報管理用クラス
|
||||
//カプセル化のためフィールドはprivate
|
||||
//値の取得や変更はgetter/setterを利用する
|
||||
|
||||
public class Task {
|
||||
//タスクID
|
||||
private int id;
|
||||
//タスク名
|
||||
private String taskName;
|
||||
//完了状態
|
||||
private boolean completed;
|
||||
//期限
|
||||
private String deadline;
|
||||
//優先度
|
||||
private int priority;
|
||||
|
||||
//コンストラクタ
|
||||
//タスク生成時に初期値を設定
|
||||
|
||||
public Task(int id, String taskName, boolean completed, String deadline, int priority) {
|
||||
this.id = id;
|
||||
this.taskName = taskName;
|
||||
this.completed = completed;
|
||||
this.deadline = deadline;
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
//ID取得
|
||||
//ゲッター
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
//タスク名取得
|
||||
//ゲッター
|
||||
public String getTaskName() {
|
||||
return taskName;
|
||||
}
|
||||
|
||||
//完了状態取得
|
||||
//ゲッター
|
||||
public boolean isCompleted() {
|
||||
return completed;
|
||||
}
|
||||
|
||||
//完了状態切り替え時に使用
|
||||
//セッター
|
||||
public void setCompleted(boolean completed) {
|
||||
this.completed = completed;
|
||||
}
|
||||
|
||||
//期限取得
|
||||
//ゲッター
|
||||
public String getDeadline() {
|
||||
return deadline;
|
||||
}
|
||||
|
||||
//優先度取得
|
||||
//ゲッター
|
||||
public int getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
}
|
||||
520
src/TaskManager.java
Normal file
520
src/TaskManager.java
Normal file
@@ -0,0 +1,520 @@
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.Scanner;
|
||||
|
||||
//タスク管理クラス
|
||||
//タスクの登録・表示・削除・状態変更
|
||||
//CSVの読込・保存
|
||||
public class TaskManager {
|
||||
// CSVファイル保存先
|
||||
public static String Path =
|
||||
"C:\\Users\\石原 叶大\\Documents\\development-taskmanager\\タスク管理システム実行例_石原\\tasks.csv";
|
||||
|
||||
//タスク一覧
|
||||
//タスク数が増減するのでArrayListを使用
|
||||
private ArrayList<Task> tasks = new ArrayList<Task>();
|
||||
//CSV読込
|
||||
//CSVデータをArrayListへ格納する
|
||||
public void loadTasks() {
|
||||
try {
|
||||
BufferedReader br = new BufferedReader(new FileReader(Path));
|
||||
|
||||
String line;
|
||||
//1行ずつ読み込むループ
|
||||
while ((line = br.readLine()) != null) {
|
||||
//カンマ区切りで分割
|
||||
String[] data = line.split(",");
|
||||
|
||||
if (data.length == 5) {
|
||||
int id = Integer.parseInt(data[0]);
|
||||
String taskName = data[1];
|
||||
boolean completed = Boolean.parseBoolean(data[2]);
|
||||
String deadline = data[3];
|
||||
int priority = Integer.parseInt(data[4]);
|
||||
|
||||
Task task = new Task(id, taskName, completed, deadline, priority);
|
||||
tasks.add(task);
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
System.out.println("CSVファイルが存在しないため新規作成します");
|
||||
}
|
||||
}
|
||||
|
||||
//CSV保存
|
||||
//ArrayList内のデータをCSVへ保存
|
||||
|
||||
public void saveTasks() {
|
||||
try {
|
||||
FileWriter fw = new FileWriter(Path);
|
||||
|
||||
//全件保存
|
||||
for (Task task : tasks) {
|
||||
fw.write(
|
||||
task.getId() + ","
|
||||
+ task.getTaskName() + ","
|
||||
+ task.isCompleted() + ","
|
||||
+ task.getDeadline() + ","
|
||||
+ task.getPriority()
|
||||
+ "\n");//改行用
|
||||
}
|
||||
fw.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
System.out.println("保存に失敗しました");
|
||||
}
|
||||
}
|
||||
|
||||
//文字色
|
||||
public static String Red = "\u001B[31m";
|
||||
public static String Yellow = "\u001B[33m";
|
||||
public static String Blue = "\u001B[36m";
|
||||
public static String Gray = "\u001B[90m";
|
||||
public static String Reset = "\u001B[0m";
|
||||
|
||||
//タスク一覧表示
|
||||
public void displayTasks() {
|
||||
|
||||
System.out.println("==========================================================");
|
||||
System.out.println(" Task Manager");
|
||||
System.out.println("==========================================================");
|
||||
System.out.println("ID | 状態 | 優先度 | 期限 | タスク名");
|
||||
System.out.println("----------------------------------------------------------");
|
||||
|
||||
if (tasks.isEmpty()) {
|
||||
System.out.println("登録されているタスクはありません。");
|
||||
return;
|
||||
}
|
||||
|
||||
//拡張for文
|
||||
//ArrayListからタスクを1件ずつ取得
|
||||
for (Task task : tasks) {
|
||||
String status;
|
||||
// TRUE/FALSEを表示用文字へ変換
|
||||
if (task.isCompleted()) {
|
||||
status = "[x] 完了 ";
|
||||
} else {
|
||||
status = "[ ] 未完了";
|
||||
}
|
||||
String priorityText = "";
|
||||
|
||||
//優先度変換
|
||||
switch (task.getPriority()) {
|
||||
|
||||
case 1:
|
||||
priorityText = "低 ";
|
||||
break;
|
||||
|
||||
case 2:
|
||||
priorityText = "中 ";
|
||||
break;
|
||||
|
||||
case 3:
|
||||
priorityText = "高 ";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (!task.isCompleted()) {
|
||||
|
||||
switch (task.getPriority()) {
|
||||
|
||||
case 1:
|
||||
priorityText = Blue + priorityText + Reset;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
priorityText = Yellow + priorityText + Reset;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
priorityText = Red + priorityText + Reset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String gray =
|
||||
padRight(String.valueOf(task.getId()), 3)
|
||||
+ "| "
|
||||
+ padRight(status, 10)
|
||||
+ "| "
|
||||
+ priorityText
|
||||
+ "| "
|
||||
+ padRight(task.getDeadline(), 11)
|
||||
+ "| "
|
||||
+ task.getTaskName();
|
||||
|
||||
if (task.isCompleted()) {
|
||||
|
||||
System.out.println(
|
||||
Gray + gray + Reset);
|
||||
|
||||
} else {
|
||||
|
||||
System.out.println(gray);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//タスク追加
|
||||
//入力内容からタスクを作成
|
||||
public void addTask(Scanner sc) {
|
||||
//行間調整用
|
||||
System.out.println();
|
||||
// タスク名入力
|
||||
System.out.print("タスク名を入力:");
|
||||
String taskName = sc.nextLine();
|
||||
|
||||
//期限入力
|
||||
System.out.print(
|
||||
"期限を入力(例:2026/09/20) [未入力で今日]:");
|
||||
|
||||
String deadline =
|
||||
sc.nextLine();
|
||||
|
||||
//未入力なら今日の日付
|
||||
if (deadline.isEmpty()) {
|
||||
deadline = LocalDate.now().toString().replace("-", "/");
|
||||
|
||||
} else {
|
||||
try {
|
||||
//入力値を日付へ変換
|
||||
LocalDate inputDate = LocalDate.parse(deadline.replace("/", "-"));
|
||||
|
||||
//過去日付なら処理中断
|
||||
if (inputDate.isBefore(LocalDate.now())) {
|
||||
System.out.println("過去の日付は入力できません。");
|
||||
|
||||
pause(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
//保存形式をYYYY/MM/DDに統一
|
||||
deadline =inputDate.toString().replace("-", "/");
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("正しい日付を入力してください。(YYYY/MM/DD) 例:2026/01/01");
|
||||
|
||||
pause(sc);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//優先度入力
|
||||
System.out.print( "優先度(1:低 2:中 3:高) [デフォルト:2]:");
|
||||
|
||||
String input = sc.nextLine();
|
||||
|
||||
//未入力なら中
|
||||
int priority = 2;
|
||||
if (!input.isEmpty()) {
|
||||
|
||||
priority = Integer.parseInt(input);
|
||||
|
||||
//1~3以外なら中断
|
||||
if (priority < 1 || priority > 3) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//新規ID
|
||||
int id = 1;
|
||||
if (!tasks.isEmpty()) {
|
||||
id = tasks.get(tasks.size() - 1).getId() + 1;
|
||||
}
|
||||
|
||||
//タスク生成
|
||||
Task task = new Task(id, taskName, false, deadline, priority);
|
||||
|
||||
//一覧へ追加
|
||||
tasks.add(task);
|
||||
|
||||
//CSV保存
|
||||
saveTasks();
|
||||
|
||||
}
|
||||
|
||||
//完了・未完了切替
|
||||
public void changeStatus(Scanner sc) {
|
||||
//行間調整
|
||||
System.out.println();
|
||||
System.out.print("状態を変更するタスクIDを入力:");
|
||||
|
||||
int targetId = Integer.parseInt(sc.nextLine());
|
||||
|
||||
boolean found = false;
|
||||
for (Task task : tasks) {
|
||||
if (task.getId() == targetId) {
|
||||
|
||||
//true・false変換
|
||||
|
||||
task.setCompleted(!task.isCompleted());
|
||||
found = true;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (found) {
|
||||
saveTasks();
|
||||
System.out.println("状態を切り替えました。");
|
||||
|
||||
} else {
|
||||
System.out.println(
|
||||
"そのIDのタスクはみつかりませんでした。");
|
||||
|
||||
}
|
||||
|
||||
pause(sc);
|
||||
|
||||
}
|
||||
|
||||
//タスク削除
|
||||
//指定IDのタスクを削除する
|
||||
public void deleteTask(Scanner sc) {
|
||||
//行間調整
|
||||
System.out.println();
|
||||
System.out.print("削除するタスクIDを入力:");
|
||||
|
||||
int targetId = Integer.parseInt(sc.nextLine());
|
||||
|
||||
boolean found = false;
|
||||
|
||||
for (int i = 0; i < tasks.size(); i++) {
|
||||
if (tasks.get(i).getId() == targetId) {
|
||||
tasks.remove(i);
|
||||
found = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
saveTasks();
|
||||
System.out.println("タスクを削除しました。");
|
||||
|
||||
} else {
|
||||
System.out.println("そのIDのタスクは見つかりませんでした。");
|
||||
|
||||
}
|
||||
|
||||
pause(sc);
|
||||
|
||||
}
|
||||
//タスク名種別判定
|
||||
//タスク名の先頭文字からソート用に番号を返す
|
||||
//英語→1、ひらがな→2、カタカナ→3、数字→4
|
||||
private int getTaskNameCategory(String taskName) {
|
||||
|
||||
if (taskName.isEmpty()) {
|
||||
return 5;
|
||||
}
|
||||
|
||||
char c = taskName.charAt(0);
|
||||
|
||||
//英字
|
||||
if ((c >= 'A' && c <= 'Z')
|
||||
|| (c >= 'a' && c <= 'z')) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
//ひらがな
|
||||
if (c >= 'あ' && c <= 'ん') {
|
||||
return 2;
|
||||
}
|
||||
|
||||
//カタカナ
|
||||
if (c >= 'ア' && c <= 'ン') {
|
||||
return 3;
|
||||
}
|
||||
|
||||
//数字
|
||||
if (c >= '0' && c <= '9') {
|
||||
return 4;
|
||||
|
||||
}
|
||||
|
||||
return 5;
|
||||
|
||||
}
|
||||
|
||||
//ソート
|
||||
//指定項目を昇順または降順で並び替える
|
||||
public void sortTasks(Scanner sc) {
|
||||
|
||||
System.out.println("[1] ID");
|
||||
System.out.println("[2] 状態");
|
||||
System.out.println("[3] 優先度");
|
||||
System.out.println("[4] 期限");
|
||||
System.out.println("[5] タスク名");
|
||||
|
||||
System.out.print("どの項目をソートしますか > ");
|
||||
|
||||
int type;
|
||||
try {
|
||||
type = Integer.parseInt(sc.nextLine());
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
Main.inputError(sc);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//入力チェック
|
||||
//1~5以外の場合はメニューへ戻る
|
||||
if (type < 1 || type > 5) {
|
||||
Main.inputError(sc);
|
||||
|
||||
return;
|
||||
}
|
||||
//行間調整
|
||||
System.out.println();
|
||||
System.out.println("[1] 昇順");
|
||||
System.out.println("[2] 降順");
|
||||
|
||||
System.out.print("並び順を選択してください > ");
|
||||
|
||||
int order;
|
||||
try {
|
||||
order = Integer.parseInt(sc.nextLine());
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
Main.inputError(sc);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//入力チェック
|
||||
//1または2以外の場合はメニューへ戻る
|
||||
if (order < 1 || order > 2) {
|
||||
Main.inputError(sc);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//true=昇順 false=降順
|
||||
boolean ascending = order == 1;
|
||||
|
||||
switch (type) {
|
||||
|
||||
//IDソート
|
||||
case 1:
|
||||
if (ascending) {
|
||||
tasks.sort(Comparator.comparingInt(Task::getId));
|
||||
|
||||
} else {
|
||||
tasks.sort(Comparator.comparingInt(Task::getId).reversed());
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
//状態ソート
|
||||
case 2:
|
||||
if (ascending) {
|
||||
tasks.sort(Comparator.comparing(Task::isCompleted));
|
||||
|
||||
} else {
|
||||
tasks.sort(Comparator.comparing(Task::isCompleted).reversed());
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
//優先度ソート
|
||||
case 3:
|
||||
if (ascending) {
|
||||
tasks.sort(Comparator.comparingInt(Task::getPriority));
|
||||
|
||||
} else {
|
||||
tasks.sort(Comparator.comparingInt(Task::getPriority).reversed());
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
//期限ソート
|
||||
case 4:
|
||||
if (ascending) {
|
||||
tasks.sort(Comparator.comparing(Task::getDeadline));
|
||||
|
||||
} else {
|
||||
tasks.sort(Comparator.comparing(Task::getDeadline).reversed());
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
//タスク名ソート
|
||||
case 5:
|
||||
if (ascending) {
|
||||
tasks.sort((task1, task2) -> {
|
||||
int category1 =getTaskNameCategory(task1.getTaskName());
|
||||
int category2 =getTaskNameCategory(task2.getTaskName());
|
||||
|
||||
//文字種別比較
|
||||
if (category1 != category2) {
|
||||
|
||||
return category1 - category2;
|
||||
|
||||
}
|
||||
|
||||
//同じ文字種別なら名前比較
|
||||
return task1.getTaskName().compareTo(task2.getTaskName());
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
tasks.sort((task1, task2) -> {
|
||||
|
||||
int category1 = getTaskNameCategory(task1.getTaskName());
|
||||
|
||||
int category2 = getTaskNameCategory(task2.getTaskName());
|
||||
|
||||
//文字種別比較
|
||||
if (category1 != category2) {
|
||||
|
||||
return category2 - category1;
|
||||
|
||||
}
|
||||
|
||||
//同じ文字種別なら逆順比較
|
||||
return task2.getTaskName().compareTo(task1.getTaskName());
|
||||
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
pause(sc);
|
||||
|
||||
}
|
||||
//指定文字数まで空白を追加
|
||||
//一覧表示の列を揃えるために利用
|
||||
public String padRight(
|
||||
String text,
|
||||
int length) {
|
||||
|
||||
while (text.length() < length) {
|
||||
text += " ";
|
||||
}
|
||||
return text;
|
||||
|
||||
}
|
||||
|
||||
//Enter待機
|
||||
public void pause(Scanner sc) {
|
||||
System.out.println("Enterキーを押してください。");
|
||||
|
||||
sc.nextLine();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
BIN
タスク管理システム実行例_石原/TaskManager.exe
Normal file
BIN
タスク管理システム実行例_石原/TaskManager.exe
Normal file
Binary file not shown.
13
タスク管理システム実行例_石原/tasks.csv
Normal file
13
タスク管理システム実行例_石原/tasks.csv
Normal file
@@ -0,0 +1,13 @@
|
||||
6,test,false,2026/10/23,2
|
||||
7,test,true,2026/10/23,2
|
||||
8,test2,false,2026/12/12,1
|
||||
9,test3,false,2026/10/23,2
|
||||
10,test,false,2026-12-12,2
|
||||
11,1,false,2026/12/12,1
|
||||
12,test,false,2026/12/12,2
|
||||
13,test,false,2026/10/23,3
|
||||
14,1,false,2026/10/23,2
|
||||
14,test,false,2026/10/23,2
|
||||
15,2,false,2026/10/23,2
|
||||
16,ぱぴこ,false,2026/10/23,2
|
||||
17,パピコ,false,2026/10/23,2
|
||||
|
Reference in New Issue
Block a user