カスタムオブジェクトでのKotlin範囲イテレータの作成

1.はじめに

前回の記事では、Kotlinで範囲を作成する方法と、Int、LongCharの各タイプを簡単に反復できることを示しました。

しかし、カスタム型反復処理したい場合はどうでしょうか。出来ますか?答えはイエスです!それでは、コードに飛び込んでその方法を見てみましょう。

2.カラフルタイプ

RGBカラーを表す単純なクラスがあると想像してみましょう。

class CustomColor(val rgb: Int): Comparable {} 

RGBカラーの範囲で反復できると便利です。

val a = CustomColor(0x000000) val b = CustomColor(0xCCCCCC) for (cc in a..b) { // do things }

3. AクイックルックIntRange

簡単に言えば、ComparableIterable、およびClosedRangeを実装する必要があります前回の記事から、Comparableを実装する必要があることはすでにわかっています

他の2つのインターフェイスについては、いくつかのヒントについてIntRangeクラス宣言を詳しく見ていきましょう。

public class IntRange(start: Int, endInclusive: Int) : IntProgression(start, endInclusive, 1), ClosedRange 

そして、IntProgressionの宣言は、Iterableを実装していることを示しています

public open class IntProgression : Iterable

したがって、これを機能させるために同様のことを実行したいと思います。

4. ColorRangeクラス

IntRangeと同様に、ColorRangeクラスを作成しましょう。

ここでは、デフォルトのステップ1を使用しても問題ないため、IntProgressionの模倣もスキップします。これにより作業が少し簡素化され、ClosedRangeIterableの両方を直接実装できるようになります

class ColorRange(override val start: CustomColor, override val endInclusive: CustomColor) : ClosedRange, Iterable{ override fun iterator(): Iterator { return ColorIterator(start, endInclusive) } }

iterator()の実装では、実際に範囲をステップスルーするという手間のかかる作業を行うColorIteratorクラスを返します。

のでColorRangeは実装ClosedRangeを インターフェイスでは、CustomColorクラスにcompareToメソッドを実装する必要があります。

override fun compareTo(other: CustomColor): Int { return this.rgb.compareTo(other.rgb) }

5. ColorIteratorクラス

ColorIteratorパズルの最後のピースです:

class ColorIterator(val start: CustomColor, val endInclusive: CustomColor) : Iterator { var initValue = start override fun hasNext(): Boolean { return initValue <= endInclusive } override fun next(): CustomColor { return initValue++ } }

initValueのタイプはCustomColorであることに注意してくださいしたがって、++演算子で変更するには、inc()メソッドもCustomColorに追加する必要があります。

operator fun inc(): CustomColor { return CustomColor(rgb + 1) }

6.カスタム範囲の使用

もうすぐだ!

カスタム範囲を定義しているので、CustomColorクラスはrangeToメソッドを実装する必要があります。rangeToの方法は、私たちが使用して私達の範囲を反復処理することができます。..演算子を追加する方法の種類等incは、私たちが使用できるようになります++演算子を。

最終製品をチェックしてみましょう:

class CustomColor(val rgb: Int): Comparable { override fun compareTo(other: CustomColor): Int { return this.rgb.compareTo(other.rgb) } operator fun rangeTo(that: CustomColor) = ColorRange(this,that) operator fun inc(): CustomColor { return CustomColor(rgb + 1) } }

そして、それが私たちに必要なすべてです!

最後に、CustomColorクラスの範囲を使用して、これがどのように連携するかを見てみましょう。

@Test fun assertHas10Colors(){ assertTrue { val a = CustomColor(1) val b = CustomColor(10) val range = a..b for (cc in range) { println(cc) } range.toList().size == 10 } }

このテストでは、範囲変数を定義し、CustomColorオブジェクトを反復処理し、それをリストに変換するために使用しました。

範囲で標準のcontainsメソッドを使用する別の例を見てみましょう。

@Test fun assertContains0xCCCCCC(){ assertTrue { val a = CustomColor(0xBBBBBB) val b = CustomColor(0xDDDDDD) val range = a..b range.contains(CustomColor(0xCCCCCC)) } }

7.結論

Kotlinには、Int、Long、およびChar値の範囲のネイティブ実装があります。この記事では、カスタムクラスに範囲を実装する方法を学びました。

いつものように、コードはGitHubで入手できます。