Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでリストを2つに分割するプログラムの書き方

この記事では、リスト(List)を前半と後半の2つに分割する方法について詳しく解説します。

リストとは、要素を順番に格納し、シーケンシャルにアクセスできる順序付きコレクションです。インデックスを指定して要素を挿入・更新・削除・検索するためのメソッドを備えており、重複した要素を持つこともできます。

リスト分割のデモ

まず、入力と出力のイメージを確認しておきましょう。

入力:

入力リスト:[Java, Python, JavaScript, Shell, Scala]

期待される出力:

リストの前半:
[Java, Python]
リストの後半:
[JavaScript, Shell, Scala]

アルゴリズム

リストを2つに分割する際の基本的な手順は以下のとおりです。

ステップ1 - 処理を開始する
ステップ2 - input_list、first_list、second_list の3つのArrayListを宣言する
ステップ3 - リストに値を設定する
ステップ4 - .size() メソッドでリストのサイズを取得する
ステップ5 - forループで input_list を走査し、インデックスが size/2 未満の要素を first_list へ、size/2 以上の要素を second_list へ .add() メソッドで追加する
ステップ6 - 結果を表示する
ステップ7 - 処理を終了する

例1:mainメソッドにすべての処理を記述する場合

この例では、すべての操作を main メソッド内にまとめて記述します。

import java.util.ArrayList;
import java.util.List;
public class Demo {
    public static void main(String[] args) {
        System.out.println("必要なパッケージがインポートされました");
        List<String> input_list = new ArrayList<String>();
        input_list.add("Java");
        input_list.add("Python");
        input_list.add("JavaScript");
        input_list.add("Shell");
        input_list.add("Scala");
        System.out.println("リストの内容: " + input_list);
        List<String> first_list = new ArrayList<String>();
        List<String> second_list = new ArrayList<String>();
        int size = input_list.size();
        System.out.println("\nリストの前半は次のとおりです:");
        for (int i = 0; i < size / 2; i++)
            first_list.add(input_list.get(i));
        System.out.println(first_list);
        System.out.println("リストの後半は次のとおりです:");
        for (int i = size / 2; i < size; i++)
            second_list.add(input_list.get(i));
        System.out.println(second_list);
    }
}

出力結果

必要なパッケージがインポートされました
リストの内容: [Java, Python, JavaScript, Shell, Scala]

リストの前半は次のとおりです:
[Java, Python]
リストの後半は次のとおりです:
[JavaScript, Shell, Scala]

例2:オブジェクト指向スタイルでメソッドに分割する場合

この例では、分割処理を独立したメソッドにカプセル化し、オブジェクト指向プログラミングらしい構成で実装します。

import java.util.ArrayList;
import java.util.List;
public class Demo {
    static void split_list(List<String> input_list) {
        List<String> first_list = new ArrayList<String>();
        List<String> second_list = new ArrayList<String>();
        int size = input_list.size();
        System.out.println("\nリストの前半は次のとおりです:");
        for (int i = 0; i < size / 2; i++)
            first_list.add(input_list.get(i));
        System.out.println(first_list);
        System.out.println("リストの後半は次のとおりです:");
        for (int i = size / 2; i < size; i++)
            second_list.add(input_list.get(i));
        System.out.println(second_list);
    }
    public static void main(String[] args) {
        System.out.println("必要なパッケージがインポートされました");
        List<String> input_list = new ArrayList<String>();
        input_list.add("Java");
        input_list.add("Python");
        input_list.add("JavaScript");
        input_list.add("Shell");
        input_list.add("Scala");
        System.out.println("リストの内容: " + input_list);
        split_list(input_list);
    }
}

出力結果

必要なパッケージがインポートされました
リストの内容: [Java, Python, JavaScript, Shell, Scala]

リストの前半は次のとおりです:
[Java, Python]
リストの後半は次のとおりです:
[JavaScript, Shell, Scala]

補足:subList() を使った簡潔な書き方

Javaでは、Listインターフェースが提供する subList(int fromIndex, int toIndex) メソッドを使えば、ループを明示的に書かずにリストの一部を取得することもできます。subList() は元のリストのビューを返すため、独立したリストとして扱いたい場合は ArrayList で包むのが一般的です。

int size = input_list.size();
List<String> first_half = new ArrayList<>(input_list.subList(0, size / 2));
List<String> second_half = new ArrayList<>(input_list.subList(size / 2, size));

まとめ

本記事では、forループと size() / 2 を組み合わせてリストを前半と後半に分割する方法を、手続き型とオブジェクト指向型の2パターンで紹介しました。要素数が奇数の場合は整数除算により切り捨てが行われるため、後半側が1つ多くなる点に注意してください。また、subList() を活用すれば、より簡潔に記述することも可能です。用途に応じて使い分けてみてください。

  1. 【Java】配列の偶数・奇数を2つのリストに分割する方法を解説

    Javaでは、剰余演算子「%」を使って数値の偶数・奇数を判定することで、配列やリストの要素を2つの異なるリストに簡単に振り分けることができます。本記事では、ユーザーから入力された整数を偶数と奇数に分類し、それぞれ別の配列に格納して出力するプログラムの実装方法を、サンプルコードとともに詳しく解説します。 サンプルコード 以下のコードは、標準入力から整数を読み込み、偶数と奇数をそれぞれ別の配列に振り分けるプログラムです。 import java.util.Scanner; public class Demo { public static void main(String[] arg

  2. 2つ以上のファイルを交互に1つのファイルへマージするJavaプログラム

    Javaでは、ScannerクラスとFileWriterクラスを組み合わせることで、複数のテキストファイルの内容を読み込み、1つの新しいファイルへ簡単にマージ(結合)できます。本記事では、3つのファイルから交互に1行ずつ読み取って結合する方法と、同じディレクトリ内の全ファイルを一括で結合する方法の2つのアプローチを紹介します。 前提となる入力ファイル ここでは、次の3つのテキストファイルが用意されているものとします。 output1.txt Hello how are you output2.txt Welcome to Tutorialspoint output3.txt We prov