Хорошо, поэтому, чтобы попытаться выучить язык kotlin, я пытаюсь реализовать кучу.
class Heap <T : Comparable<T>>(private var heap: Array<T>, private var size: Int){
У меня возникли некоторые трудности с тем, как ведут себя обнуляемые типы. В начале я дал массив элементов, но у меня возникли трудности, когда я хотел выделить больше элементов
private fun increaseSize(){
if(size == heap.size){
//okay this is garbage
var enlargedHeap = arrayOfNulls<Comparable<*>>(heap.size * 2) as Array<T>
System.arraycopy(heap, 0, enlargedHeap, 0, size)
heap = enlargedHeap
}
}
Так что здесь я предполагаю, что я меняю кучу с Array<T>
на Array<T?>
, что имеет смысл. Поэтому я также изменил конструктор, взяв Array<T?>
, и он предлагает некоторые довольно интересные вещи, где бы я ни пытался получить доступ heap[x]
else heap[pos1].compareTo(heap[pos2]) < 0
к
else heap[pos2]?.let { heap[pos1]?.compareTo(it) }!! < 0
, тогда я посмотрел во всплывающей подсказке о том, что arrayOfNulls<Comparable<*>>(heap.size * 2) as Array<T>
вернул Array<T>
Но при выполнении arrayOfNulls
он действительно возвращает массив с нулевыми значениями. Однако я получаю сообщение об ошибке, если я пытаюсь heap[x] = null
заявить
Нуль не может быть значением ненулевого типа T
Если я измените конструктор на Array<T?>
, тогда входные массивы также должны явно обнуляться.
Что я исправил с помощью
class Heap <T : Comparable<T>>{
private var heap: Array<T?>
private var size = 0
constructor(heap: Array<T>, size){
this.heap = heap as Array<T?>
this.size = size
}
Но теперь он не принимает массивы с нулевыми значениями, когда Я пытаюсь создать экземпляр массива со значениями, допускающими обнуление
var arr = arrayOfNulls<String>(9)
var heap = Heap(arr, arr.size-1)
Так что теперь мне нужны два конструктора? Что происходит
Несоответствие типов. Требуется: Сравнимо Найдено: Строка?
Даже при Àrray<T?>
есть ошибки с сравнению, чтобы не принимать значения NULL.
Даже с проверками все равно выдает ошибку
return if(pos2 > size || (heap[pos1] == null || heap[pos2] == null)) false
else heap[pos1].compareTo(heap[pos2]) < 0
Несоответствие типов. Обязательно: T Найдено: T?
Как разрешить массиву содержать нулевые значения?
Надеюсь, без использования Array<T>
обнуляемого, поскольку это нарушает сравнение, и множественные конструкторы кажутся плохим дизайном.