目次へ

5.2. コレクションを操作するクラス

「java.util.Collections」はコレクションを扱う上で便利な機能を提供するユーティリティクラスです。Arraysクラスとよく似た機能だけでなく、コレクションクラス特有の機能も提供されています。まずArraysクラスとよく似た機能について説明します。

static void sort(List)
static void sort(List, Comparator)
リストの要素を昇順でソートします。「Arrays.sort」と異なり、ソーティングにはマージソートが利用されます。また要素間の比較には、「Object.compareTo(Object)」か、引数に指定されたComparatorが使用されます。
static int binarySearch(List, Object)
static int binarySearch(List, Object, Comparator)
リストから引数で指定されたオブジェクトを検索します。「Arrays.binarySearch」と同じく、リストは予めソートされていなければなりません。
static void fill(List, Object) リスト内の要素全てを、指定されたオブジェクトに置き換えます。このメソッドは要素数に関わらず、一定時間で終了します。

続いて他の機能について説明します。

static int indexOfSubList(List, List)
static int lastIndexOfSubList(List, List)

第1引数で指定されたリストから、第2引数で指定されたリストが最初に出現する(「lastIndexOfSubList」の場合は最後)インデックスを検索します。出現しない場合は「-1」を返します。

List source = new ArrayList();
List target = new ArrayList();
...
int index = Collections.indexOfSubList(source, target);
...

static Object max(Collection)
static Object max(Collection, Comparator)
static Object min(Collection)
static Object min(Collection, Comparator)

コレクションから、最大(「min」の場合は最小)の要素を検索して返します。要素の比較には「Object.compareTo(Object)」かComparatorクラスを使用します。

String max = Collections.max(source);
String min = Collections.min(source);

static void reverse(List)
static void rotate(List, int)
static void shuffle(List)
static void shuffle(List, Random)
static void swap(List, int, int)

これらのメソッドはいずれも要素の入れ替えを行うメソッドです。「reverse」は逆順にします。以下の例のリストの場合は、「edcba」の順に入れ替わります。「rotate」は引数で指定された数だけ要素をずらします。一番最後の要素を後ろにずらす場合は先頭に、一番先頭の要素を前にずらす場合は最後に移動します。3つずらした場合は、「cdeab」となります。「shuffle」はランダムに入れ替えを行います。どのような順になるか解りません。「swap」は指定された要素同士の入れ替えを行います。

String array[] = {"a", "b", "c", "d", "e"};
List list = Arrays.asList(array);
Collections.rotate(list, 3);
...

static Set singleton(Object)
static List singletonList(Object)
static Map singletonMap(Object, Object)
static List nCopies(int, Object)

「singleton」「singletonList」「singletonMap」は引数で指定された要素のみを持つセット・リスト・マップを返すメソッドです。「nCopies」は引数で指定された数だけ要素を持つリストを返します。いずれも不変のコレクションを返しますので、要素の追加・変更・削除は認められません。

Set set = Collections.singleton("singleton");
...

static void copy(List, List)

第2引数で指定したリストの要素を第1引数で指定したリストにコピーします。第1引数のリストは、第2引数のリストより長い必要があります。長い分に関しては、コピーの影響を受けません。

Collections.copy(target, source);
...

static boolean replaceAll(List, Object, Object)

指定のリストに関して、第2引数で指定したオブジェクトを全て、第3引数で指定したオブジェクトに入れ替えます。入れ替えが行われた場合に「true」を返します。

Collections.replaceAll(source, "old", "new");
...

static Comparator reverseOrder()

通常(自然順序付け)とは逆順にソートを行うComparatorを返します。例えば以下の例では、アルファベット順とは逆順にソートが行われます。

String array[] = {"a", "b", "c", "d", "e"};
Arrays.sort(array, Collections.reverseOrder());
...

static Collection unmodifiableCollection(Collection)
static List unmodifiableList(List)
static Map unmodifiableMap(Map)
static Set unmodifiableSet(Set)
static SortedMap unmodifiableSortedMap(SortedMap)
static SortedSet unmodifiableSortedSet(SortedSet)

以上のメソッドは、いずれも変更不可能なコレクション・ビューを返すメソッドです。これらを使用することにより、ユーザはリードオンリー(変更不可能)なコレクションを返すメソッドを定義する事が可能となります。

public List getList() {
    List list = new List();
    ...
    return(Collections.unmodifiableList(list));
}

static Collection synchronizedCollection(Collection)
static List synchronizedList(List)
static Map synchronizedMap(Map)
static Set synchronizedSet(Set)
static SortedMap synchronizedSortedMap(SortedMap)
static SortedSet synchronizedSortedSet(SortedSet)

コレクションはいずれもスレッドセーフではありません。つまり複数のスレッドから単一のコレクションを操作した場合、予想外の挙動をする可能性があります。以上のメソッドはコレクションをスレッドセーフにするためのメソッドです。これらのメソッドの返り値を使用することにより、複数のスレッドからのアクセスに対しても同期が保証されるようになります。ただし繰り返し処理を行う場合には、synchronizedブロックと組み合わせて使用する必要があります。

Set set = Collections.synchronizedSet(new HashSet());
...
synchronized(set) {
    Iterator iterator = set.iterator();
    while(iterator.hasNext()) {
        Object obj = iterator.next();
        ...
    }
}

(実習課題3)

以下のコンソールアプリケーションを作成しなさい。

  • 要素が10個以上あるStringのリストを作成する事。
  • そのリストをCollectionsの「reverse」「rotate」「shuffle」「swap」メソッドで並び替えたときの結果を表示する事。

解答例はこちら

(実習課題4)

以下のコンソールアプリケーションを作成しなさい。

  • 要素が10個以上ある数値のリストを作成する事。
  • そのリストをCollectionsの「reverseOrder」の返り値を用いてソートした場合の結果を表示する事。
  • またリストに対して、Collectionsの「unmodifableList」を適用し、その返り値に対して変更を加えたときに発生する例外を確認する事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ