Java上級

上級 Javaで学ぶデータ構造|練習問題編

導入

データ構造は、プログラムの効率性や可読性に大きく影響を与える要素です。特に、業務で遭遇する複雑なデータ処理において、適切なデータ構造を選択することが求められます。ここでは、上級Javaプログラマーに向けて、実際の業務シナリオに基づいたデータ構造の利用方法を考察します。

教科書レベルの解説(データ構造)

重要な概念の整理

データ構造の選択は、プログラムのパフォーマンスに直結します。例えば、リスト、スタック、キュー、マップなど、それぞれのデータ構造には特有の利点と欠点があります。特に、データの挿入や削除が頻繁に発生する場合、選択するデータ構造によってプログラムの効率が大きく異なります。

コード例(Java)


import java.util.LinkedList;
import java.util.Queue;

public class TaskScheduler {
    private Queue taskQueue;

    public TaskScheduler() {
        taskQueue = new LinkedList<>();
    }

    public void addTask(String task) {
        taskQueue.offer(task);
    }

    public String executeTask() {
        return taskQueue.poll();
    }

    public boolean hasTasks() {
        return !taskQueue.isEmpty();
    }

    public static void main(String[] args) {
        TaskScheduler scheduler = new TaskScheduler();
        scheduler.addTask("Task 1");
        scheduler.addTask("Task 2");

        while (scheduler.hasTasks()) {
            System.out.println("Executing: " + scheduler.executeTask());
        }
    }
}

コードの行ごとの解説

  1. import java.util.LinkedList;:LinkedListクラスをインポートします。これは、FIFO(先入れ先出し)データ構造を実装するために使用します。
  2. import java.util.Queue;:Queueインターフェースをインポートします。これは、タスクの管理に必要なメソッドを定義します。
  3. private Queue<String> taskQueue;:タスクを保持するためのキューを宣言します。
  4. public TaskScheduler() { taskQueue = new LinkedList<>(); }:コンストラクタで新しいLinkedListのインスタンスを作成し、taskQueueに割り当てます。
  5. public void addTask(String task) { taskQueue.offer(task); }:新しいタスクをキューに追加するメソッドです。
  6. public String executeTask() { return taskQueue.poll(); }:キューの先頭からタスクを取得し、実行するメソッドです。タスクが存在しない場合はnullを返します。
  7. public boolean hasTasks() { return !taskQueue.isEmpty(); }:キューにタスクが存在するかを確認するメソッドです。
  8. public static void main(String[] args) { ... }:プログラムのエントリポイントです。タスクを追加し、実行するロジックが含まれています。

練習問題編

以下に3つの練習問題を用意しました。各問題に対して模範解答と解説を示します。

  1. 問題1:タスクを優先度に基づいて処理するためのデータ構造を設計してください。

    模範解答:優先度キューを使用してタスクを管理します。Javaでは、PriorityQueueクラスを利用できます。

  2. 問題2:タスクが実行される順序を保持する方法を提案してください。

    模範解答:LinkedListを使用して、タスクを追加した順序を保持します。リストの先頭からタスクを取り出すことで、順序を維持できます。

  3. 問題3:タスクの重複を防ぐための方法を考えてください。

    模範解答:HashSetを使用して、追加する前にタスクが既に存在するかをチェックします。存在しない場合のみキューに追加します。

まとめ

  • データ構造の選択は、プログラムの効率に直接影響します。
  • タスク管理のシナリオでは、キューやリスト、優先度キューなどが有効です。
  • 実際の業務で遭遇するケースを想定し、柔軟なデータ構造の利用が求められます。