20200801のJavaに関する記事は3件です。

【Java】JDK 13のSwitch Expressions (Preview)を見てみましょう

OpenJDK 13の5つの重要機能

350: Dynamic CDS Archives
351: ZGC: Uncommit Unused Memory
353: Reimplement the Legacy Socket API
354: Switch Expressions (Preview)
355: Text Blocks (Preview)

上記の中でも本日は「Switch Expressions (Preview)」を見ていきたいと思います。

Switch Expressions (Preview)

  • JDK 12でもPreviewでしたか13でもPreviewですね。
  • Previewなので--enable-previewのオプションを与えないと使えないらしいです。

・Arrow labels

static void howMany(int k) {
    switch (k) {
        case 1  -> System.out.println("one");
        case 2  -> System.out.println("two");
        default -> System.out.println("many");
    }
}

従来の「case L:」をよく使用していましたが、「case L->」のようにも使えるようになりました。
ただ、「case L->」のような書き方をするとfull throughがないためbreakを書かなくてもよいらしいです。

呼び出すときは以下となります。
howMany(1);
howMany(2);
howMany(3);
結果
one
two
many

・Switch expressions

switchがexpressionで使えるようになりました。

static void howMany(int k) {
    System.out.println(
        switch (k) {
            case  1 -> "one"
            case  2 -> "two"
            default -> "many"
        }
    );
}

なので、switch文の結果を変数に代入することもできます。

T result = switch (arg) {
    case L1 -> e1;
    case L2 -> e2;
    default -> e3;
};

・Yielding a value

「yield」キーワードが追加されました。

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result; // switch文の戻り値を設定
    }
};

「yield」は"case L:"式のswitch文の中でも使用できます。

int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【アルゴリズム】文字列の降順

問題説明

文字列sのパラメータを受け取り、降順でソートを行って新しい文字列を返却するメソッドsolutionを作成してください。
sは英文字の小文字、大文字のみで構成されていて、大文字は小文字より値が小さい値として扱う。

条件

  • パラメータ:sの長さは1以上の文字列です。

入出力の例

x result
"Zbcdefg" "gfedcbZ"

解説

※解説は私が作成したコードなので、もっといいアルゴリズム等々ありましたら、共有してください!

方法1

class Solution {
    public String solution(String s) {
        return Stream.of(s.split("")) // 文字列を1文字ずつ分割
            .sorted(Comparator.reverseOrder()) // 降順にソート
            .collect(Collectors.joining()); // 分割した文字列を1つの文字列にする。
    }
}

方法2

class Solution {
    public String solution(String s) {
        char[] sol = s.toCharArray(); // 文字列からchar配列を取得
        Arrays.sort(sol); // "Zbcdefg"

        // StringBuilderのreverseを利用して逆順にする。
        return new StringBuilder(new String(sol)).reverse().toString();
    }
}

※個人的には「方法1」のほうが簡略で読みやすくて好きですが、
速度のほうは「方法2」のほうが早いですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【アルゴリズム】Xだけ間隔がのあるN個の数字

問題説明

メソッドsolutionは整数xと自然数nのパラメータを受け取り、xから初めてxずつ増加する数字をn個もつリストをリターンします。
次の条件を見ていただき、条件を満足させるメソッドsolutionを作成してください。

条件

  • xは-10000000以上、10000000以下の整数である。
  • nは1000以下の自然数である。

入出力の例

x n result
2 5 [2,4,6,7,10]
4 3 [4,8,12]
-4 2 [-4,-8]

解説

※解説は私が作成したコードなので、もっといいアルゴリズム等々ありましたら、共有してください!

class Solution {
    public long[] solution(int x, int n) {
        long[] result = new long[n];
        result[0] = x; // xから初めるので、Index 0にxを初期化

        // 上記で0番は初期化したので、iは1からスタートし、nまで繰り返し
        for (int i = 1; i < n; i++) {
            // xずつ増加していくので、resultのIndex:i - 1の値 + xを行う。
            result[i] = result[i - 1] + x;
        }

        return result;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む