【KotlinとJava】範囲(レンジ)を使う

11 範囲(レンジ)を使う

KotlinとJavaサンプルで理解

前回のforではリストや配列のループについてのサンプルだった。今回は範囲を自分で設定してループを行うサンプルとなる。
少し長いがコードはいくつかのパートに分かれている。少しづつ読み進めていこう。

Use ranges and in.kt

fun main(args: Array<String>) {  
    val x = args[0].toInt()  
    //Check if a number lies within a range:  
    val y = 10  
    if (x in 1..y - 1) {  
        println("OK")  
    }  
  
    //Iterate over a range:  
    for (a in 1..5) {  
        print("$a ")  
    }  
  
    //Check if a number is out of range:  
    println()  
    val array = arrayListOf<String>()  
    array.add("aaa")  
    array.add("bbb")  
    array.add("ccc")  
  
    if (x !in 0..array.size - 1) {  
        println("Out: array has only ${array.size} elements. x = $x")  
    }  
  
    //Check if a collection contains an object:  
    if ("aaa" in array) { // collection.contains(obj) is called  
        println("Yes: array contains aaa")  
    }  
  
    if ("ddd" in array) { // collection.contains(obj) is called  
        println("Yes: array contains ddd")  
    } else {  
        println("No: array doesn't contains ddd")  
    }  
}

リンク

range

rangeというのは範囲のことである。範囲は連続した数値の集まりで、たとえば「1から10」のようなものだ。Javaでは範囲を直接扱うことができない。より大きい(たとえば、10 < x)、より小さい(たとえば y < 50)といった具合だ。他には、いったんリストを作成し、リストに含まれるかどうかを確認する方法だ。しかしこの場合はリスト内の数値が連続しているかどうか保証はできない。

downTo, step, until

連続した数字を作る方法はいくつか用意されている。
まずは普通の方法。「1から10」を示す。

1..10    // 1 to 10

次は大きい数字から小さい数字。「10から1」を示す。
残念だが、10..1とは記述できない。

10 downTo 1    // 10 to 1

一定の間隔をあけて数値を作るとき。「1, 3, 5, 7, 9」を示す。

1..10 step 2    // 1, 3, 5, 7, 9

最後の数値を含めたくない場合。「1から9」を示す。

1 until 10    // 1 to 9(10は含まない)

in

inの否定形が出てきた。

x !in 0..10

だ。こりゃまたわかりやすい。

!(x in 0..10)

より、直感的に感じる。

Javaで記述

対比ができるようにJavaでも同じものを記述してみよう。

public class Exp11 {  
  
    public static void main(String[] args) {  
        final int x = Integer.parseInt(args[0]);  
  
        final List<Integer> yRange = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);  
        if (yRange.contains(x)) {  
            System.out.println("OK");  
        }  
  
        final List<Integer> aRange = Arrays.asList(1, 2, 3, 4, 5);  
        for (Integer a : aRange) {  
            System.out.println(a);  
        }  
  
        System.out.println();  

        final List<String> array = new ArrayList<>();  
        array.add("aaa");  
        array.add("bbb");  
        array.add("ccc");  
  
        if (!(0 <= x && x <= (array.size() - 1)))
            String template = "Out: array has only %d elements. x = %d";  
            System.out.println(String.format(template, array.size(), x));  
        }
  
        if (array.contains("aaa")) {  
            System.out.println("Yes: array contains aaa");  
        }  
  
        if (array.contains("ddd")) {  
            System.out.println("Yes: array contains ddd");  
        } else {  
            System.out.println("No: array doesn't contains ddd");  
        }  
    }  
}

以下の部分の書き換えに悩んだ。集合が動的になるとJavaの表現力では追い付かない。

if (x !in 0..array.size - 1)

次のように、いったんリストを作成する方法もあるが、回りくどい感じがする。

// 連続した数値のリストを作成
final List<Integer> bRange = new ArrayList<>();  
for (int i = 0; i < array.size() - 1; i++) {  
    bRange.add(i);  
}  
// リストに含まれるかを確認  
if (!bRange.contains(x)) {  
    String template = "Out: array has only %d elements. x = %d";  
  System.out.println(String.format(template, array.size(), x));  
}

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成