Menu
Coddy logo textTech

タスクの削除

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 24/68。

challenge icon

チャレンジ

簡単

タスク管理システムのこのパートでは、リストからタスクを削除する機能を実装します。このチャレンジでは、append 関数を使用して特定の要素を除いたスライスを再構築するスライス操作に焦点を当て、データ構造からアイテムを永続的に削除する方法を学びます。

3つの入力を受け取ります:

  • タスクの数(例:"4")を表す文字列
  • "name1:status1,name2:status2,name3:status3" という形式のタスクデータを含む文字列。ここで status は "true" または "false" です(例:"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true"
  • 削除するタスクのインデックスを表す文字列(例:2番目のタスクの場合は "1"。0ベースのインデックスを使用します)

あなたのタスクは以下の通りです:

  1. 以前のチャレンジと同じ、Name (string) と Completed (bool) フィールドを持つ Task 構造体を定義します
  2. Task 構造体のスライスとインデックス (int) をパラメータとして受け取る removeTask という名前の関数を作成します
  3. removeTask 関数内で、append を使用して対象のインデックスの前後の要素を結合することにより、指定されたインデックスのタスクが削除された新しいスライスを返します
  4. 2番目の入力からタスクデータを解析して、タスクのスライスを作成します:
    • 入力をカンマで分割して、個々のタスクエントリを取得します
    • 各エントリをコロンで分割して、名前とステータスを分離します
    • ステータス文字列をブール値に変換します("true"true に、"false"false になります)
  5. 3番目の入力文字列を整数に変換して、タスクのインデックスを取得します
  6. removeTask 関数を呼び出す前に、削除されるタスクの名前を保存しておきます
  7. スライスとインデックスを指定して removeTask 関数を呼び出し、返されたスライスを保存します
  8. タスクを削除した後、以前のチャレンジと同じ形式ですべての残りのタスクを表示します:
    • 完了したタスクの場合:"[x] [task_name]"
    • 未完了のタスクの場合:"[ ] [task_name]"
  9. 確認メッセージを出力します:"Task '[task_name]' removed successfully!"
  10. 更新されたサマリーを出力します:"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

インデックス文字列を整数に変換するには strconv パッケージを使用してください。このチャレンジでは、対象の要素の前後の部分を結合してスライスを再構築するために append を使用する方法を示します。これにより、残りの要素の順序を維持しながら、コレクションからアイテムを効果的に削除できます。

自分で試してみよう

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

func completeTask(tasks *[]Task, index int) {
	(*tasks)[index].Completed = true
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskDataStr := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskDataStr, ",")
	tasks := make([]Task, len(taskEntries))
	
	for i, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks[i] = Task{Name: name, Completed: status}
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Complete the task
	taskName := tasks[index].Name
	completeTask(&tasks, index)
	
	// Display all tasks
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' marked as completed!\n", taskName)
	
	// Count completed and incomplete tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}
	incompleteCount := len(tasks) - completedCount
	
	// Print summary
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}

論理とフローのすべてのレッスン