yucatio@システムエンジニア

趣味で作ったものいろいろ

Enumを宣言順に並び変える(ジェネリクス版)

Enumのリストを宣言順に並び変えたいときには、自然順に並べるか、宣言順であることを明示したい場合はEnum.ordinal()を使用します。

Enum (Java SE 17 & JDK 17)

// Enumクラス
public enum Element {
  FIRE, WATER, ELECTRRIC, POISON
}
List<Element> elements = List.of(Element.ELECTRRIC, Element.POISON, Element.WATER, Element.FIRE, Element.WATER, Element.POISON);

List<Element> sorted = elements.stream()
    .sorted()
    .toList();

// もしくは
//    List<Element> sorted = elements.stream()
//        .sorted(Comparator.comparing(Enum::ordinal))
//        .toList();

System.out.println(sorted);
// => [FIRE, WATER, WATER, ELECTRRIC, POISON, POISON]

メソッドに切り出し

並び変え部分をメソッドにします。

public static List<Element> sortByOrdinal(List<Element> list) {
  return list.stream()
      .sorted()
      .toList();
}
// 呼び出し側
List<Element> elements = List.of(Element.ELECTRRIC, Element.POISON, Element.WATER, Element.FIRE, Element.WATER, Element.POISON);
    
List<Element> sorted = sortByOrdinal(elements);
    
System.out.println(sorted);
// => [FIRE, WATER, WATER, ELECTRRIC, POISON, POISON]

ジェネリクス

ジェネリクス化します。Enumクラスの親クラスはE extends Enum<E>で表すことができます。

public static <E extends Enum<E>> List<E> sortByOrdinal(List<E> enumList) {
  if (enumList == null) {
    return null;
  }

  return enumList.stream()
      .sorted()
      .toList();

  // もしくは
  // return enumList.stream()
  //  .sorted(Comparator.comparing(Enum::ordinal))
  //  .toList();
}

呼び出し側は特に変更なしです。

// 呼び出し側
List<Element> elements = List.of(Element.ELECTRRIC, Element.POISON, Element.WATER, Element.FIRE, Element.WATER, Element.POISON);
    
List<Element> sorted = sortByOrdinal(elements);
    
System.out.println(sorted);
// => [FIRE, WATER, WATER, ELECTRRIC, POISON, POISON]

バージョン

Java 17