Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

書籍 パーフェクトJava | コレクションの技法

パンくず

書籍 パーフェクトJava
コレクションの技法

概要

Javaのコレクションの技法について

Javaのコレクションの技法

関数的なコレクション

コレクション自体を変更せず、あらたなコレクションを返却する。
破壊的なメソッド、副作用のあるメソッドは使用者にそれを意識させる必要があるため好ましくない。
(このあたりはコレクションに限った話でもないですが)

コレクションの初期化

・Arrays.asList

List<Integer> list = Arrays.asList(1,2);

・無名クラスと静的初期化子

List<Integer> list = new ArrayList<Integer>() {
  {
    add(1);
    add(2);
  }
};
ソート

Collection#sortを使用する。
比較する値はComparableを実装し、Collections.sortの引数として渡すこと。
この処理のように、特定のメソッドを渡すことを目的としたオブジェクトをファンクタと言います。
用途としては他言語の高階関数(関数を引数で渡す)にあたります。

ソートサンプルコード
package perfect.sort;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortSample {
  public static void main(String[] args) {
    List<Hoge> hoges = Arrays.asList(new Hoge("10"),new Hoge("2"),new Hoge("1"));
    System.out.println("ソート前:" + hoges);
    Collections.sort(hoges, new HogeNumberComparator());
    System.out.println("数値ソート:" + hoges);
    Collections.sort(hoges, new HogeStringComparator());
    System.out.println("文字列ソート:" + hoges);
  }

  static class Hoge {
    public String number = "0";

    Hoge(String number) {
      this.number = number;
    }

    @Override
    public String toString() {
      return number;
    }
  }

  static class HogeNumberComparator implements Comparator<Hoge> {
    @Override
    public int compare(Hoge o1, Hoge o2) {
      Integer number1 = Integer.parseInt(o1.number);
      Integer number2 = Integer.parseInt(o2.number);
      return number1 - number2;
    }
  }

  static class HogeStringComparator implements Comparator<Hoge> {
    @Override
    public int compare(Hoge o1, Hoge o2) {
      return o1.number.compareTo(o2.number);
    }
  }
}
ソートサンプル出力
ソート前:[10, 2, 1]
数値ソート:[1, 2, 10]
文字列ソート:[1, 10, 2]