技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Java の Comparator の実装

leetCodeの「179. Largest Number」を解いた。
https://leetcode.com/problems/largest-number/

この問題を解く過程で、苦手な Java の Comparator の実装を行う必要があったので、コードにコメントを詳しく書いた。今後の参考のために、書いたコードをここに残しておく。

public String largestNumber(int[] nums) {
    List<String> numStrs = new ArrayList<>();
    for (int num : nums) {
        numStrs.add(Integer.toString(num));
    }

    // Comparator をラムダ式で表現している。
    // a, b と入力があったとして、
    // a < b の時 (a -> b の順にしたい時)、右側の式はマイナス値を返し、
    // a > b の時 (b -> a の順にしたい時)、右側の式はプラス値を返すように実装する。
    numStrs.sort((a, b) -> (b + a).compareTo(a + b));
    // 例えば、a = 30, b = 3 とする。
    // この時、"330".compareTo("303") -> プラス値 となるため、
    // b -> a の順となる。意図通り、3 30 という順になる。

    StringBuilder sb = new StringBuilder();
    for (String numStr : numStrs) {
        sb.append(numStr);
    }

    // For edge case.
    if (sb.charAt(0) == '0') {
        return "0";
    }
    else {
        return sb.toString();
    }
}

上記の通り、Comparator の実装の際、簡易化のためラムダ式を使っているが、ラムダ式を使わなくても考え方は同じ。