{"id":25713,"date":"2024-12-03T15:46:55","date_gmt":"2024-12-03T06:46:55","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25713"},"modified":"2024-12-04T04:44:36","modified_gmt":"2024-12-03T19:44:36","slug":"java-todolist","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25713","title":{"rendered":"Java TodoList"},"content":{"rendered":"<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>import java.io.*;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.*;\n\nclass TodoItem implements Serializable {\n    private static final long serialVersionUID = 1L;\n    private static int counter = 1;\n    private int id;\n    private String description;\n    private String category;\n    private Date deadline;\n    private String priority;\n    private boolean completed;\n\n    public TodoItem(String description, String category, String deadline, String priority) throws ParseException {\n        this.id = counter++;\n        this.description = description;\n        this.category = category;\n        this.deadline = new SimpleDateFormat(\"yyyy-MM-dd\").parse(deadline);\n        this.priority = priority;\n        this.completed = false;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public Date getDeadline() {\n        return deadline;\n    }\n\n    public String getPriority() {\n        return priority;\n    }\n\n    public boolean isCompleted() {\n        return completed;\n    }\n\n    public void markCompleted() {\n        this.completed = true;\n    }\n\n    public boolean isOverdue() {\n        return !completed &amp;&amp; deadline.before(new Date());\n    }\n\n    @Override\n    public String toString() {\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd\");\n        String status = isCompleted() ? \"\u5b8c\u4e86\" : (isOverdue() ? \"\u671f\u9650\u5207\u308c\" : \"\u672a\u5b8c\u4e86\");\n        return String.format(\"%-4d %-30s %-15s %-10s %-10s %-10s\",\n                id, description, category, priority, sdf.format(deadline), status);\n    }\n}\n\npublic class TodoListApp {\n    private Map&lt;String, List&lt;TodoItem>> userTasks = new HashMap&lt;>();\n    private static final String DATA_FILE = \"todo_data.ser\";\n    private String currentUser = \"default\";\n\n    public TodoListApp() {\n        loadTasks();\n    }\n\n    public void addTask(String description, String category, String deadline, String priority) {\n        try {\n            userTasks.computeIfAbsent(currentUser, k -> new ArrayList&lt;>())\n                     .add(new TodoItem(description, category, deadline, priority));\n            System.out.println(\"\u30bf\u30b9\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002\");\n            saveTasks();\n        } catch (ParseException e) {\n            System.out.println(\"\u7121\u52b9\u306a\u65e5\u4ed8\u5f62\u5f0f\u3067\u3059\u3002\u5f62\u5f0f yyyy-MM-dd\");\n        }\n    }\n\n    public void listTasks() {\n        List&lt;TodoItem> tasks = userTasks.getOrDefault(currentUser, new ArrayList&lt;>());\n        if (tasks.isEmpty()) {\n            System.out.println(\"\u30bf\u30b9\u30af\u304c\u3042\u308a\u307e\u305b\u3093\u3002\");\n            return;\n        }\n\n        System.out.println(String.format(\"%-4s %-30s %-15s %-10s %-10s %-10s\",\n                \"ID\", \"\u30bf\u30b9\u30af\u5185\u5bb9\", \"\u30ab\u30c6\u30b4\u30ea\", \"\u512a\u5148\u5ea6\", \"\u671f\u9650\", \"\u72b6\u614b\"));\n        tasks.stream()\n             .sorted(Comparator.comparing(TodoItem::getDeadline).thenComparing(TodoItem::getPriority))\n             .forEach(System.out::println);\n    }\n\n    public void markTaskCompleted(int id) {\n        List&lt;TodoItem> tasks = userTasks.getOrDefault(currentUser, new ArrayList&lt;>());\n        for (TodoItem task : tasks) {\n            if (task.getId() == id) {\n                task.markCompleted();\n                System.out.println(\"\u30bf\u30b9\u30af\u3092\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002\");\n                saveTasks();\n                return;\n            }\n        }\n        System.out.println(\"\u30bf\u30b9\u30af\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\");\n    }\n\n    public void removeTask(int id) {\n        List&lt;TodoItem> tasks = userTasks.getOrDefault(currentUser, new ArrayList&lt;>());\n        if (tasks.removeIf(task -> task.getId() == id)) {\n            System.out.println(\"\u30bf\u30b9\u30af\u3092\u524a\u9664\u3057\u307e\u3057\u305f\u3002\");\n            saveTasks();\n        } else {\n            System.out.println(\"\u30bf\u30b9\u30af\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\");\n        }\n    }\n\n    private void saveTasks() {\n        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(DATA_FILE))) {\n            oos.writeObject(userTasks);\n        } catch (IOException e) {\n            System.out.println(\"\u30bf\u30b9\u30af\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\");\n        }\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private void loadTasks() {\n        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(DATA_FILE))) {\n            userTasks = (Map&lt;String, List&lt;TodoItem>>) ois.readObject();\n        } catch (IOException | ClassNotFoundException e) {\n            System.out.println(\"\u4ee5\u524d\u306e\u30bf\u30b9\u30af\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\");\n        }\n    }\n\n    public static void main(String&#91;] args) {\n        TodoListApp app = new TodoListApp();\n        Scanner scanner = new Scanner(System.in);\n\n        while (true) {\n            System.out.println(\"\\nTODO\u30ea\u30b9\u30c8 - \" + app.currentUser);\n            System.out.println(\"1. \u30bf\u30b9\u30af\u3092\u8ffd\u52a0\");\n            System.out.println(\"2. \u30bf\u30b9\u30af\u3092\u4e00\u89a7\u8868\u793a\");\n            System.out.println(\"3. \u30bf\u30b9\u30af\u3092\u5b8c\u4e86\u6e08\u307f\u306b\u3059\u308b\");\n            System.out.println(\"4. \u30bf\u30b9\u30af\u3092\u524a\u9664\");\n            System.out.println(\"5. \u7d42\u4e86\");\n            System.out.print(\"\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044: \");\n\n            int choice = scanner.nextInt();\n            scanner.nextLine(); \/\/ \u6539\u884c\u3092\u6d88\u8cbb\n\n            switch (choice) {\n                case 1:\n                    System.out.print(\"\u30bf\u30b9\u30af\u5185\u5bb9: \");\n                    String description = scanner.nextLine();\n                    System.out.print(\"\u30ab\u30c6\u30b4\u30ea: \");\n                    String category = scanner.nextLine();\n                    System.out.print(\"\u671f\u9650 (yyyy-MM-dd): \");\n                    String deadline = scanner.nextLine();\n                    System.out.print(\"\u512a\u5148\u5ea6 (\u9ad8, \u4e2d, \u4f4e): \");\n                    String priority = scanner.nextLine();\n                    app.addTask(description, category, deadline, priority);\n                    break;\n                case 2:\n                    app.listTasks();\n                    break;\n                case 3:\n                    System.out.print(\"\u5b8c\u4e86\u3059\u308b\u30bf\u30b9\u30af\u306eID: \");\n                    int completeId = scanner.nextInt();\n                    app.markTaskCompleted(completeId);\n                    break;\n                case 4:\n                    System.out.print(\"\u524a\u9664\u3059\u308b\u30bf\u30b9\u30af\u306eID: \");\n                    int removeId = scanner.nextInt();\n                    app.removeTask(removeId);\n                    break;\n                case 5:\n                    System.out.println(\"\u7d42\u4e86\u3057\u307e\u3059\u3002\");\n                    scanner.close();\n                    return;\n                default:\n                    System.out.println(\"\u7121\u52b9\u306a\u9078\u629e\u3067\u3059\u3002\");\n            }\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>javac -encoding UTF-8 TodoListApp.java<br>java TodoListApp<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>javac -encoding UTF-8 TodoListApp.javajava TodoListApp<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[76],"tags":[75,3],"class_list":["post-25713","post","type-post","status-publish","format-standard","hentry","category-java","tag-java","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25713"}],"version-history":[{"count":2,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25713\/revisions"}],"predecessor-version":[{"id":25715,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25713\/revisions\/25715"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25713"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}