Menu
Coddy logo textTech

Comparable インターフェース

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 72/110。

== は2つの objects が等しいかどうかを示しますが、どちらが先に来るかを知る必要がある場合もあります。Comparable インターフェースを使うと、自然な順序を定義して objects を並べ替えられます。

classを比較可能にするには、Comparable<T>を実装し、compareToメソッドをoverrideします。このメソッドは、thisotherより前に来る場合は負の数、等しい場合は0、thisが後に来る場合は正の数を返します。

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

void main() {
  var students = [
    Student('Alice', 85),
    Student('Bob', 92),
    Student('Carol', 78),
  ];
  
  students.sort();
  
  for (var s in students) {
    print('${s.name}: ${s.grade}');
  }
  // Carol: 78, Alice: 85, Bob: 92
}

クラスが Comparable を実装すると、カスタムコンパレーターを指定せずに sort() を使用できます。組み込みの数値型と文字列型はすでに Comparable を実装しているため、grade.compareTo(other.grade) は直接機能します。

descending order の場合は、objects を入れ替えるか結果を否定して comparison を単純に逆にします:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // 降順
}
challenge icon

チャレンジ

簡単

タスクを優先度レベルで並べ替えられるタスク管理システムを構築しましょう!Comparable インターフェースを実装する Task class を作成し、タスクのリストを優先度の高い順から低い順に自動的に並べ替えられるようにします。

コードを2つのファイルに整理します。

  • task.dart: name(String)と priority(int。数値が大きいほど優先度が高い)を持つToDo項目を表す Task class を作成します。並べ替えたときに、タスクが優先度の降順(最も高い優先度が先)で表示されるよう、Comparable<Task> を実装してください。また、toString() を override して、次の形式を返すようにします:[name] (Priority: [priority])
  • main.dart: taskファイルを import し、Comparable インターフェースによって自動的に並べ替えられることを示します。次の4つのタスクを含むリストを作成します。
    • 優先度 2'Write report'
    • 優先度 5'Fix critical bug'
    • 優先度 1'Update documentation'
    • 優先度 3'Review code'
    Before sorting: を Print し、その後、各タスクを Print します。sort() を使ってリストを並べ替え、空行を Print してから、After sorting: を Print し、続けて各タスクをもう一度 Print します。

Task class が Comparable を実装しているため、カスタム comparator を指定せずにリスト上で直接 sort() を呼び出せます。タスクは、実装した compareTo に基づいて自動的に整列されます!

期待される出力:

Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)

After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)

自分で試してみよう

import 'task.dart';

void main() {
  // TODO: 次のTaskオブジェクトのリストを作成する:
  // - 'Write report' を優先度 2 で
  // - 'Fix critical bug' with priority 5
  // - 'Update documentation' with priority 1
  // - 'Review code' を優先度 3 で
  
  List<Task> tasks = [
    // TODO: ここに4つのタスクを追加する
  ];
  
  // TODO: Print "Before sorting:"
  // TODO: リスト内の各タスクを出力する
  
  // TODO: sort()を使ってリストをソートする
  
  // TODO: 空行を出力する
  
  // TODO: Print "After sorting:"
  // TODO: ソート済みリスト内の各タスクを出力する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Dartオンラインコンパイラ