Java | 配列の中身を一部だけ表示する小さなユーティリティ(サンプル実装)

Java Java
スポンサーリンク
/*
 * ArrayPreview.java
 *
 * 小さな配列プレビュー/スライス用ユーティリティ(初心者向け)
 * - 任意の配列(プリミティブ配列/Object配列)に対応
 * - 先頭 N 要素 / 末尾 M 要素 を見やすく抜き出す previewEnds
 * - 範囲スライス slice(start, end)
 * - null 安全
 *
 * 使い方(例):
 *  - ArrayPreview.preview(oneDimArray, 5)
 *  - ArrayPreview.previewEnds(bigArray, 3, 2)
 *  - ArrayPreview.slice(array, 2, 6)
 */

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayPreview {

    /**
     * 指定配列の先頭 "count" 個(または配列が短ければ全部)を文字列で返す。
     * null 安全。
     */
    public static String preview(Object array, int count) {
        if (array == null) return "null";
        if (!array.getClass().isArray()) return String.valueOf(array);
        int len = Array.getLength(array);
        if (len == 0) return "[]";
        int take = Math.max(0, Math.min(count, len));
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (int i = 0; i < take; i++) {
            sb.append(elemToString(Array.get(array, i)));
            if (i < take - 1) sb.append(", ");
        }
        if (take < len) {
            sb.append(", ... (" + len + " total)");
        }
        sb.append(']');
        return sb.toString();
    }

    /**
     * 配列の先頭 head 個と末尾 tail 個を表示して、間を "... (N total)" で省略する。
     * 例: [a, b, c, ..., y, z] のように出る。
     */
    public static String previewEnds(Object array, int head, int tail) {
        if (array == null) return "null";
        if (!array.getClass().isArray()) return String.valueOf(array);
        int len = Array.getLength(array);
        if (len == 0) return "[]";
        if (head < 0) head = 0;
        if (tail < 0) tail = 0;
        // head + tail が配列長以上なら全部表示
        if (head + tail >= len) {
            StringBuilder sb = new StringBuilder();
            sb.append('[');
            for (int i = 0; i < len; i++) {
                sb.append(elemToString(Array.get(array, i)));
                if (i < len - 1) sb.append(", ");
            }
            sb.append(']');
            return sb.toString();
        }
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (int i = 0; i < head; i++) {
            sb.append(elemToString(Array.get(array, i))).append(", ");
        }
        sb.append("... (" + len + " total) , ");
        for (int i = len - tail; i < len; i++) {
            sb.append(elemToString(Array.get(array, i)));
            if (i < len - 1) sb.append(", ");
        }
        sb.append(']');
        return sb.toString();
    }

    /**
     * 配列の範囲スライスを返す。start は inclusive、end は exclusive。
     * 範囲外なら自動でクリップする。(負の start は 0 に、end が長さを超えたら長さに)
     */
    public static String slice(Object array, int start, int end) {
        if (array == null) return "null";
        if (!array.getClass().isArray()) return String.valueOf(array);
        int len = Array.getLength(array);
        int s = Math.max(0, start);
        int e = Math.min(len, end);
        if (s >= e) return "[]";
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (int i = s; i < e; i++) {
            sb.append(elemToString(Array.get(array, i)));
            if (i < e - 1) sb.append(", ");
        }
        sb.append(']');
        return sb.toString();
    }

    // 内部ユーティリティ:要素(プリミティブ、文字列、配列など)の表示を人が読める形にする
    private static String elemToString(Object elem) {
        if (elem == null) return "null";
        Class<?> cls = elem.getClass();
        if (cls.isArray()) {
            // 要素自体が配列(ネスト)だった場合、deepToString を使って中身を表示
            // Arrays.deepToString は Object[] を期待するが、ラップして呼ぶことで
            // プリミティブ配列にも対応させる
            String wrapped = Arrays.deepToString(new Object[]{elem}); // -> [[...]]
            // 最外側の [ ] を取り除く
            if (wrapped.length() >= 2 && wrapped.charAt(0) == '[' && wrapped.charAt(wrapped.length()-1) == ']') {
                return wrapped.substring(1, wrapped.length()-1);
            }
            return wrapped;
        }
        return String.valueOf(elem);
    }

    // デモ用 main
    public static void main(String[] args) {
        int[] small = {1,2,3,4,5};
        String[] fruits = {"apple","banana","orange","grape","peach","melon"};
        int[][] matrix = {{1,2},{3,4},{5,6}};

        System.out.println("preview(small, 3): " + preview(small, 3));
        System.out.println("preview(fruits, 4): " + preview(fruits, 4));
        System.out.println("previewEnds(fruits, 2, 2): " + previewEnds(fruits, 2, 2));
        System.out.println("slice(small, 2, 5): " + slice(small, 2, 5));
        System.out.println("preview(matrix, 2): " + preview(matrix, 2));
        System.out.println("previewEnds(matrix, 1, 1): " + previewEnds(matrix, 1, 1));
    }
}
Java

使い方の簡単な説明:

  • ArrayPreview.preview(array, n) — 先頭 n 個を表示(配列が短ければ全部)
  • ArrayPreview.previewEnds(array, head, tail) — 先頭 head 個と末尾 tail 個を表示して間を省略(... (N total)
  • ArrayPreview.slice(array, start, end) — start(inclusive)〜end(exclusive)のスライスを表示
  • どのメソッドもプリミティブ配列/Object配列/ネスト配列に対応し、null 安全になっています。

キャンバスのコードはそのままコピペして javac でコンパイル→実行できます。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました