ここからは 「実務でよく使うソート処理」 をテーマに、現場レベルの練習問題+解答を用意します。
ファイル操作・データクラス処理・Comparator の応用など、就職後にもそのまま使える内容です。
- 実務版 練習問題(全6問)
- Q1. 指定フォルダ内のファイルを「名前順(昇順)」にソートして一覧表示しなさい。
- Q2. ファイル一覧を「サイズの大きい順(降順)」にソートしなさい。
- Q3. ファイル一覧を「更新日時の新しい順(降順)」にソートしなさい。
- Q4. 拡張子ごとにファイルをソートし、同じ拡張子内では名前順にしなさい。
- Q5. 顧客リスト(Customerクラス)を「購入金額の降順」→「名前の昇順」の複合条件でソートしなさい。
- Q6. ログファイルリストを「日付(LocalDate)→ログレベル(ERROR > WARN > INFO)」でソートしなさい。
- Q1 解答:ファイル名昇順ソート
- Q2 解答:サイズの降順
- Q3 解答:更新日時の降順(新しい順)
- Q4 解答:拡張子 → 名前 の2段階ソート
- Q5 解答:複数キー(購入金額降順 → 名前昇順)
- Q6 解答:日付 → ログレベル の優先度ソート
実務版 練習問題(全6問)
Q1. 指定フォルダ内のファイルを「名前順(昇順)」にソートして一覧表示しなさい。
仕様:
- フォルダパスはコード内に固定でよい
Fileの配列を取得 → ソートして表示
Q2. ファイル一覧を「サイズの大きい順(降順)」にソートしなさい。
ヒント:
file.length()がサイズ(バイト)- 降順は
Comparator.reverseOrder()もしくは(a, b) -> Long.compare(b, a)
Q3. ファイル一覧を「更新日時の新しい順(降順)」にソートしなさい。
ヒント:
file.lastModified()でミリ秒取得
Q4. 拡張子ごとにファイルをソートし、同じ拡張子内では名前順にしなさい。
例:
txt → aaa.txt, memo.txt
java → Main.java, Util.java
png → a.png, b.png
Q5. 顧客リスト(Customerクラス)を「購入金額の降順」→「名前の昇順」の複合条件でソートしなさい。
class Customer {
String name;
int totalPrice;
}
Java実務でとてもよく出る「複数キーソート」。
Q6. ログファイルリストを「日付(LocalDate)→ログレベル(ERROR > WARN > INFO)」でソートしなさい。
LogEntryクラス例:
class LogEntry {
LocalDate date;
String level; // "ERROR", "WARN", "INFO"
String message;
}
Javaログ解析でよくあるパターン。
Q1 解答:ファイル名昇順ソート
import java.io.File;
import java.util.Arrays;
public class Q1 {
public static void main(String[] args) {
File dir = new File("C:/test"); // 任意のフォルダ
File[] files = dir.listFiles();
if (files == null) return;
Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2.getName()));
for (File f : files) {
System.out.println(f.getName());
}
}
}
JavaQ2 解答:サイズの降順
import java.io.File;
import java.util.Arrays;
public class Q2 {
public static void main(String[] args) {
File dir = new File("C:/test");
File[] files = dir.listFiles();
if (files == null) return;
Arrays.sort(files, (f1, f2) -> Long.compare(f2.length(), f1.length()));
for (File f : files) {
System.out.println(f.getName() + " : " + f.length());
}
}
}
JavaQ3 解答:更新日時の降順(新しい順)
import java.io.File;
import java.util.Arrays;
public class Q3 {
public static void main(String[] args) {
File dir = new File("C:/test");
File[] files = dir.listFiles();
if (files == null) return;
Arrays.sort(files, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()));
for (File f : files) {
System.out.println(f.getName() + " : " + f.lastModified());
}
}
}
JavaQ4 解答:拡張子 → 名前 の2段階ソート
import java.io.File;
import java.util.Arrays;
public class Q4 {
public static void main(String[] args) {
File dir = new File("C:/test");
File[] files = dir.listFiles();
if (files == null) return;
Arrays.sort(files, (f1, f2) -> {
String e1 = getExt(f1.getName());
String e2 = getExt(f2.getName());
int extCompare = e1.compareToIgnoreCase(e2);
if (extCompare != 0) return extCompare;
return f1.getName().compareToIgnoreCase(f2.getName());
});
for (File f : files) {
System.out.println(f.getName());
}
}
private static String getExt(String name) {
int i = name.lastIndexOf('.');
return (i == -1) ? "" : name.substring(i + 1);
}
}
JavaQ5 解答:複数キー(購入金額降順 → 名前昇順)
import java.util.Arrays;
import java.util.Comparator;
class Customer {
String name;
int totalPrice;
Customer(String n, int p) { name = n; totalPrice = p; }
public String toString() { return name + "(" + totalPrice + ")"; }
}
public class Q5 {
public static void main(String[] args) {
Customer[] cs = {
new Customer("Sato", 5000),
new Customer("Yamada", 12000),
new Customer("Ito", 12000),
new Customer("Kato", 3000)
};
Arrays.sort(cs,
Comparator.comparingInt(Customer::getTotalPrice).reversed()
.thenComparing(c -> c.name)
);
System.out.println(Arrays.toString(cs));
}
}
Java※ getTotalPrice() を作る場合はゲッターを書いてください。
Q6 解答:日付 → ログレベル の優先度ソート
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Comparator;
class LogEntry {
LocalDate date;
String level;
String message;
LogEntry(LocalDate d, String l, String m) {
date = d; level = l; message = m;
}
public String toString() { return date + " [" + level + "] " + message; }
}
public class Q6 {
public static void main(String[] args) {
LogEntry[] logs = {
new LogEntry(LocalDate.of(2024, 1, 5), "INFO", "start"),
new LogEntry(LocalDate.of(2024, 1, 5), "ERROR", "fail"),
new LogEntry(LocalDate.of(2023, 12, 31), "WARN", "warning"),
new LogEntry(LocalDate.of(2024, 1, 5), "WARN", "something"),
};
Arrays.sort(logs,
Comparator.comparing((LogEntry l) -> l.date) // 日付昇順
.thenComparing(l -> levelPriority(l.level)) // ERROR > WARN > INFO
);
System.out.println(Arrays.toString(logs));
}
private static int levelPriority(String level) {
switch (level) {
case "ERROR": return 0;
case "WARN": return 1;
default: return 2; // INFO
}
}
}
Java