Java | 配列を「昇順・降順」に並び替えする

Java Java
スポンサーリンク

ここからは 「実務でよく使うソート処理」 をテーマに、現場レベルの練習問題+解答を用意します。
ファイル操作・データクラス処理・Comparator の応用など、就職後にもそのまま使える内容です。


実務版 練習問題(全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());
        }
    }
}
Java

Q2 解答:サイズの降順

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());
        }
    }
}
Java

Q3 解答:更新日時の降順(新しい順)

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());
        }
    }
}
Java

Q4 解答:拡張子 → 名前 の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);
    }
}
Java

Q5 解答:複数キー(購入金額降順 → 名前昇順)

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

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