【Java入門】リスト(List)で初期化・ソートしてみよう!配列との違いは!?

【Java入門】リスト(List)で初期化・ソートしてみよう!配列との違いも確認Java入門
スポンサーリンク

こんにちは!しーま(@s59shima)です。

いつもブログをご覧いただきありがとうございます。

今回は、こんな悩みや疑問を持った人に向けて記事を書きました。

読者
読者

配列のように複数の値を保持できるのは分かったけど、実際にどうやって使用するの!?

リスト(List)の使い方」や「配列との違い」について知りたい方におすすめです。

プログラミングでの リスト(List) は使用頻度がめちゃめちゃあると思います。

基本的な使用方法などを学んでいきましょう!!

リスト(List)とは

複数の値をまとめて保持できるオブジェクトの総称を「コレクション」と言います。

そしてJavaには標準APIとしてコレクション関連が多数提供されています。

その中の1つとして【List】が存在します。

Listは、追加した順序を保持するコレクションです。

List系の代表的なクラスとして「ArrayList」「LinkedList」がありますね。

どのようなクラス図になっているか確認してみましょう。

リスト系のクラス図
リスト系のクラス図

実は、ArrayList/ LinkedListクラスは様々なクラスを継承したり、インターフェースを実装などをして成り立っているんです。※AbstractListクラスやAbstractCollectionクラスは省略。

リスト(List)の初期化

new演算子を用いて初期化・オブジェクトを生成することが出来ます。

たとえば、String型のリストを初期化・生成する場合はこんな感じになります。

import java.util.ArrayList;
ArrayList<String> list = new ArrayList<String>();

LinkedListを初期化・生成する場合は上記の【ArrayList】の部分を置き換えればよいです。

初期化のポイントは以下の2つです。

  1. 格納できる要素数を変更できるため、初期化時に要素数を定義しない
  2. ジェネリクス(Generics)を用いて【型の指定】を行う

1. 要素数を指定しなくてもよい

リストは配列とは異なり、初期化の段階で要素数の宣言をしなくてもよいのです。

そのため、後から要素の追加・削除が可能です。

配列の場合は、下記のように初期化の段階で宣言する必要があり、要素数を宣言したら変更することはできません。

String[] array = new String[5]; // 配列の場合
ArrayList<String> list = new ArrayList<String>(); // リスト(List系)の場合

ここが配列と大きな違いになります。

2. ジェネリクスを用いて型を強調

リストの初期化を行う際、以下のように書くこともできます。

ArrayList list = new ArrayList();

実は、初期化は2種類の方法があるのです。違いはデータ型を宣言している・していないです。

ArrayList<String> list = new ArrayList<String>(); // データ型の宣言あり
ArrayList list = new ArrayList(); // データ型の宣言なし

データ型を宣言している <String> などの書き方はジェネリクス(Generics)と言います。

データ型を宣言してリストを初期化(ジェネリクス有)した場合と宣言せずリストを初期化(ジェネリクス無)した場合を比較し、ジェネリクス有が推奨される理由を解説します。

ジェネリクス【有】サンプルコード

import java.util.ArrayList;

public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("java");
    String message = list.get(0);
    System.out.println(message);
  }
}

実行結果は下記の通り。

java

ジェネリクス【無】サンプルコード

import java.util.ArrayList;

public class Test {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add("java");
    String message = list.get(0);
    System.out.println(message);
  }
}

実行結果は下記の通り。

構文エラー(8行目)

ジェネリクス無の場合は、8行目で構文エラーとなってしまいました。

理由はリストを初期化する際にデータ型を宣言していないため、8行目でString型にキャストしてあげる必要があります。

つまり、8行目を「String message = (String)list.get(0)」と明示的に書く必要があります。

ジェネリクス【無】の場合、プログラムミスにも繋がりやすく、都度キャストする手間がかかります

以上の理由から、リストを初期化する場合 ジェネリクス【有】で宣言することをオススメします。

リスト(List)のソート

リストを使えば簡単にソートが実現できます。小さい順・大きい順に並び替えるやり方について確認していきましょう。

小さい順に並び替える場合

まずは、小さい順に並び替える場合です。Javaの標準クラスを使用することで実現できますよ。

Collectionsクラスのsortメソッドです。

import java.util.ArrayList;
import java.util.Collections;

public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("e");
    list.add("c");
    list.add("b");
    list.add("d");
    System.out.println(list); // ソート前の並び順
    Collections.sort(list);
    System.out.println(list); // ソート後の並び順
  }
}

実行結果( ソート前の並び順 )は下記の通り

[a, e, c, b, d]

リストに挿入した順に表示されていることがわかりますね。ソートはされていません。

実行結果( ソート後の並び順 )は下記の通り

[a, b, c, d, e]

小さい順に並び替えされていることがわかります。

下記のたったの一行でソートすることが出来ます。とても便利ですよね。

Collections.sort(list);

ちなみに「アルファベット」以外で「数値」も小さい順に並び替えしてくれます。

大きい順に並び替える場合

次に、大きい順に並び替える場合です。

今回は2パターンの方法を紹介します。

1つ目は、CollectionsクラスのreverseOrderメソッドです。

こちらもJava標準クラス・メソッドを使用して実現できます。

public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("e");
    list.add("c");
    list.add("b");
    list.add("d");
    System.out.println(list); // ソート前の並び順
    Collections.sort(list, Collections.reverseOrder());
    System.out.println(list); // ソート後の並び順
  }
}

実行結果( ソート前の並び順 )は下記の通り

[a, e, c, b, d]

実行結果( ソート後の並び順 )は下記の通り

[e, d, c, b, a]

大きい順に並び替えされていることがわかります。

  • 小さい順 Collections.sort( 対象のデータ )
  • 大きい順 Collections.sort( 対象のデータ, Collections.reverseOrder() )

以上、Java標準クラスを使用してソート(並び替え)するやり方について紹介しました。

次は大きい順に並び替える2パターン目ですが、少し特殊です(笑)。

ですが、汎用的に並び替えができるので、合わせて紹介しますね。

2つ目は、Comparetorインターフェースのcompareメソッドです。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Test {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("e");
    list.add("c");
    list.add("b");
    list.add("d");
    // Comparatorインターフェースを使用
    Collections.sort(list, new Comparator() {
      public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        String s2 = (String)o2;
        if (s1.compareTo(s2) < 1) {
          return 1;
        } else if (s1.compareTo(s2) == 0) {
          return 0;
        } else {
          return -1;
        }
      }
    });
    System.out.println(list); // ソート後の並び順
  }
}

実行結果( ソート後の並び順 )は下記の通り

[e, d, c, b, a]

大きい順に並び替えできていることがわかりますね。

まとめ

本記事は以上になります。

リスト(List)の初期化やソートの方法について解説を行いました。

使用方法について全ては紹介できなかったので、コードを書きながら色々と試していくとよいです。

最後まで読んで頂きありがとうございます。

List/Set/Mapの活用方法について、下記の記事がありますので合わせてどうぞ

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました