2016-03-07 99 views
4

假設我有通過4個頂點的路徑。在做快速原型我會在Java中定義了這個Kotlin和詳細數組實例化

double[][] path = {{1.0, 2.0}, {1.0,3.0}, {3.0,4.0}, {8.0,9.0}} 

使用arrayOf,並doubleArrayOf功能在科特林相同的代碼將

val path = arrayOf(doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0,3.0), doubleArrayOf(8.0,9.0)) 

其中詳細感覺有點。有沒有解決這個問題的Kotlin方式?

編輯:用例在數字數據的「REPL like」環境中回答查詢,即考慮Matlab或SciPy。

+0

我會用'data'類編寫「正常」生產Kotlin代碼,並歸檔「快速原型」的速度和簡易性。不知道REPL的事情.. – voddan

+0

「REPL like」環境對於這個問題意味着什麼,目前還不清楚這是如何影響可能的答案的。 –

+0

就像處理較短代碼片段的科學工作流程一樣,通常但不是在REPL中完成。基於預感,你形成了一個假設和一組測試假設的問題。爲了試試你的問題,你可以模擬一些簡單的測試數據。您在真實和測試數據上迭代幾次。這個問題在程序上是微不足道的,而域是一個挑戰。最後,通常會拋棄假設,然後繼續前進。如果您擊中黃金,那麼您可以使用常規軟件方法來構建服務。 –

回答

5

arrayOfdoubleArrayOf和其他類似的,只是stdlib中的頂級函數。爲了縮短語法,你可以很容易地在頂層的函數內創建scope自己的函數,一個類中,甚至在本地:

通過創建:

fun pathOf(vararg points: DoubleArray): Array<out DoubleArray> = points 
fun pt(x: Double, y: Double) = doubleArrayOf(x,y) 

這樣:

val path = pathOf(pt(1.0, 2.0), pt(1.0, 2.0), pt(1.0, 3.0), pt(8.0, 9.0)) 

現在給出了未來讀者或代碼的嵌套數組意義。將函數命名爲point,pt,xy,或其他任何適合您的用例的函數。

此代碼只比原來的,也許稍長比Java更可讀/意味深長:

double[][] path = {{1.0, 2.0}, {1.0, 3.0}, {3.0, 4.0}, {8.0, 9.0}} 

這些功能都只是儘可能高效利用arrayOfdoubleArrayOf,如果反覆使用的JVM終將inline他們,但如果你很緊張,你可以自己讓他們inline

Kotlin的目標是延長,任何時候遇到這樣的問題時都會考慮如何擴展API或更改函數以獲得所需的可讀性。

+0

這是一個明顯的答案。用例是在數字大數據的「REPL like」環境中回答查詢,即考慮Matlab或numpy。我使用的當前解決方案是爲數組創建設置通用的短手函數,如fun d(vararg v:Double)= doubleArrayOf(* v)'和fun f(vararg v:Float)= floatArrayOf(* v) '。有時候我會感覺到Kotlin一方面給予了什麼,即操作符重載和中綴,而另一方面則需要數組聲明。非常感謝您的意見! –

+0

澄清以上評論。我不需要爲數組聲明聲明一個通用的簡寫函數,只是爲了使代碼片段可讀。那麼有更好的選擇還是這種方式? –

+1

這是數組。 Kotlin不希望它們的特殊容量比其他收集類型有所不同。在JVM世界中,數組實際上具有統計上較低的使用率,並且當人們應該使用正常集合時,這些數據中的大部分是偶然的。所以它們被放置在與集合甚至字段相同的發現級別和語法級別。 –

10

至於stdlib的goest,這是儘可能短。然而,你可以定義一個輔助函數自己:

fun doubles(vararg values: Pair<Double, Double>) = values 
    .map { doubleArrayOf(it.first, it.second) } 
    .toTypedArray() 

用法:

fun main(args: Array<String>) { 
    val path = doubles(1.0 to 2.0, 1.0 to 3.0, 3.0 to 4.0, 8.0 to 9.0) 
} 

這不是最有效的解決方案,因爲它涉及到拳擊和一個臨時數組和列表的配置,但如果你只有原型設計應該沒問題。

編輯:

我也做了一個版本,你可以添加任意長度的數組:

inline fun doubles(block: DoubleArrayBuilder.() -> Unit) = DoubleArrayBuilder() 
     .apply(block) 
     .list.toTypedArray() 

class DoubleArrayBuilder { 
    val list = mutableListOf<DoubleArray>() 

    fun add(vararg doubles: Double) = list.add(doubles) 
} 

用法:

fun main(args: Array<String>) { 
    val path = doubles { 
     add(2.0, 3.0, 4.0) 
     add(2.0, 3.0, 4.0) 
     add(2.0, 3.0, 4.0) 
    } 
} 
+0

性能不是一個巨大的,但可讀性。我在設置中看到的限制是它僅限於成對。 –

+1

我編輯了我的答案並添加了一個構建器樣式的版本,您可以在其中添加任意長度的雙數組。 –