/*
* 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 でコンパイル→実行できます。
