DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章31

このJavaプログラムが何をしているのかを説明し、コードにコメントアウトで解説を追加します。

import java.util.ArrayList; // ArrayListクラスをインポート
import java.util.Arrays; // Arraysクラスをインポート

public class Main {
    public static void main(String[] args) {
        // ArrayListを作成し、アルファベットのリストで初期化
        var alphabet = new ArrayList<>(
            Arrays.asList(
                new String[] {"A", "B", "C", "D", "E"}
            )
        );

        // アルファベットを逆順にソート
        alphabet.sort((var a, var b) -> -a.compareTo(b));

        // ソートされたアルファベットをコンソールに出力
        alphabet.forEach(System.out::println);
    }
}
Enter fullscreen mode Exit fullscreen mode

プログラムの説明

  1. import java.util.ArrayList;import java.util.Arrays;は、ArrayListクラスとArraysクラスをインポートしています。これにより、プログラム内でこれらのクラスを使用することができます。

  2. public class Main {は、Mainという名前のクラスを定義しています。

  3. public static void main(String[] args) {は、Javaアプリケーションのエントリーポイントであるmainメソッドを定義しています。

  4. var alphabet = new ArrayList<>(Arrays.asList(new String[] {"A", "B", "C", "D", "E"}));は、新しいArrayListを作成し、AからEまでの文字列を含むリストで初期化しています。

  5. alphabet.sort((var a, var b) -> -a.compareTo(b));は、リストの要素を逆順にソートしています。compareToメソッドを使用して文字列を比較し、-をつけることで降順に並べ替えています。

  6. alphabet.forEach(System.out::println);は、リストの各要素を標準出力に出力しています。

このプログラムは、AからEまでのアルファベットを含むリストを作成し、それを逆順にソートしてから、ソートされたアルファベットをコンソールに出力します。

追記

ラムダ式を通常のコードに直したバージョンを以下に示します。

import java.util.ArrayList; // ArrayListクラスをインポート
import java.util.Arrays; // Arraysクラスをインポート
import java.util.Comparator; // Comparatorクラスをインポート

public class Main {
    public static void main(String[] args) {
        // ArrayListを作成し、アルファベットのリストで初期化
        var alphabet = new ArrayList<>(
            Arrays.asList(
                new String[] {"A", "B", "C", "D", "E"}
            )
        );

        // アルファベットを逆順にソート(通常のComparatorクラスを使用)
        alphabet.sort(new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return -a.compareTo(b);
            }
        });

        // ソートされたアルファベットをコンソールに出力
        for (String letter : alphabet) {
            System.out.println(letter);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

プログラムの説明

  1. import java.util.Comparator;は、Comparatorクラスをインポートしています。これにより、カスタムの比較ロジックを持つ比較器を作成できます。

  2. ラムダ式だったalphabet.sort((var a, var b) -> -a.compareTo(b));を、匿名クラスを使用した通常のComparator実装に置き換えました。

  3. ラムダ式だったalphabet.forEach(System.out::println);を、拡張forループを使用して置き換えました。

この変更により、ラムダ式を使用しないで同じ機能を実現しています。

補足

@Overrideでオーバーライドしている元のメソッドは、Comparatorインターフェースに定義されています。Comparatorインターフェースは、java.utilパッケージに含まれており、以下のように定義されています。

Comparatorインターフェース

package java.util;

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);

    // 他のメソッド(デフォルトメソッドや静的メソッド)もありますが、省略しています
}
Enter fullscreen mode Exit fullscreen mode

オーバーライドされているメソッド

上記のComparatorインターフェースの中で、オーバーライドされているメソッドはcompareメソッドです。このメソッドは、2つの引数を受け取り、それらを比較して順序を決定します。

実際のコードでのオーバーライド

あなたのコードの中で、以下の部分がComparator<String>インターフェースのcompareメソッドをオーバーライドしています。

alphabet.sort(new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return -a.compareTo(b);
    }
});
Enter fullscreen mode Exit fullscreen mode

このコードでは、匿名クラスを使ってComparator<String>を実装し、compareメソッドをオーバーライドしています。このオーバーライドされたcompareメソッドは、2つのStringオブジェクトabを比較し、その結果にマイナスをつけることで降順に並べ替えています。

まとめ

オーバーライド元のcompareメソッドは、Comparatorインターフェースに定義されているものです。このメソッドをオーバーライドすることで、ArrayListのソート方法をカスタマイズしています。

Top comments (0)