我已将java shellSort转换为Kotlin。问题是我不知道这个方法。
爪哇
package Sorts;
public class ShellSort extends Sorter{
@Override
public <T extends Comparable<? super T>> void sort(T[] a) {
int h = 1;
while((h*3+1) < a.length)
h = 3*h+1;
while(h > 0){
for(int i = h-1; i < a.length; i++){
T s = a[i];
int j = i;
for(j = i; (j>=h) && (a[j-h].compareTo(s) > 0); j-=h)
a[j] = a[j-h];
a[j] = s;
}
h /= 3;
}
}
}
科特林
fun <T : Comparable<T>> shellSort(a: Array<T>) {
var h = 1
while (h * 3 + 1 < a.size)
h = 3 * h + 1
while (h > 0) {
for (i in h - 1..a.size - 1) {
val s = a[i]
var j = i
j = i
while (j >= h && a[j - h].compareTo(s) > 0) {
a[j] = a[j - h]
j -= h
}
a[j] = s
}
h /= 3
}
}
我试图调用的是将intArray转换为数组
val array = intArrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4)
shellSort(arrayOf(array))
出现错误
Type parameter bound for T in
fun <T : Comparable<T>> shellSort(a: Array<T>) : Unit
is not satisfied: inferred type IntArray is not a subtype of Comparable<IntArray>
答案 0 :(得分:7)
intArrayOf
会返回IntArray
,其中不会延伸 Array<Int>
。由于stated in the documentation Kotlin为各种基元提供了专门的数组类型,避免了拳击开销。 IntArray
对应于Java int[]
。 ShellSort.sort
方法(Kotlin和Java)都需要盒装版本。
您可以使用toTypedArray
扩展程序将IntArray
转换为Array<Int>
,如下所示:
val array = intArrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4).toTypedArray()
shellSort(array)
或者@KirillRakhman建议直接创建一个盒装版本:
shellSort(arrayOf(5, 3, 0, 2, 4, 1, 0, 5, 2, 3, 1, 4))
答案 1 :(得分:2)
这一行
shellSort(arrayOf(array))
不会将IntArray array
转换为常规Array<Integer>
,而是将其包装在Array<IntArray>
类型的单个数组中。使用IntArray.toTypedArray()
将其转换为通用数组,建议为@miensol
。