2017-02-18 5 views
0

Таким образом, целью этого кода является создание очереди приоритетов с использованием сортированного массива.Общий объект, получающий нулевое значение, а не двойное значение

В настоящее время у меня есть объект C, который возвращает null, когда я не считаю, что это должно быть.

Соответствующий код:

int n = 5; 
    PQ<Double> pq1 = new PQasSortedArray<Double>(n); 
    double[] arr1 = new double[n]; 

    for(int i = 0; i < n; i++){ 
     Random num = new Random(); //Assigning random double values to the array 
     arr1[i] = num.nextDouble(); 
    } 

    for (int i=0; i < arr1.length; i++){ 
     pq1.insert(arr1[i]); 
    } 
    for (int i=arr1.length-1; i >=0 ; i--){ 
     arr1[i] = pq1.deleteMin(); 
    } 

В моем классе PQasSortedArray У меня есть следующий код: соответствующий

public class PQasSortedArray<C extends Comparable<? super C>> implements PQ<C> { 
    private C[] arr; 
    private int currentSize; 

public PQasSortedArray(int size) { 
     arr = (C[]) new Comparable[size]; 
     currentSize = 0; 
    } 
public void insert(C data){ 
     arr[currentSize++] = data; 
    } 

public C min(){ 
    C tmp = arr[0]; // <-- This gives tmp a value of null, which is not what I want 

    for(int i = 1; i < currentSize; i++) { // <-- This is skipped entirely as tmp is null 
     if(tmp.compareTo(arr[i]) > 0) { 
      tmp = arr[i]; 
     } 
    } 
    return tmp; 

} 

public C deleteMin(){ // <-- This also doesn't work as intended 
    C tmp = arr[0]; 
    arr[0] = arr[currentSize-1]; 
    arr[currentSize-1] = null; 
    currentSize--; 
    return tmp; 
} 

Так что я вообще довольно уверен, как идти об этом. Я не привык использовать дженерики, поэтому я мог бы пропустить что-то совершенно очевидное.

public interface PQ<C extends Comparable<? super C>> { 
public boolean isFull(); 

public boolean isEmpty(); 

public void insert(C data); 

public C min(); 

public C deleteMin(); 

}

+1

Код указан в первом блоке является то, что я использую в качестве теста. Учитывая 5 двойных значений, результат равен 5 двойным значениям, а их индексы изменяются на -1, поэтому 0 становится последним из массива, а 1 становится 0 и т. Д. Предполагается удалить минимальное значение массива и вернуть массив размер n-1, где исходный массив равен n. Я выяснил, что часть того, что я хотел сделать, - это упорядочить массив от наименьшего числа в методе вставки, но я все еще смущен, почему tmp становится нулевым. – Nyxre

+0

«Это пропущено полностью, поскольку tmp равно null» в этой строке нет ничего, что пропустило бы, если tmp был пустым. Если currentSize был равен нулю, то ... – weston

+0

Пожалуйста, разместите свой интерфейс PQ. – ceklock

ответ

0

В конце испытательного currentSize == 1:

public C deleteFirst() { // <-- This also doesn't work as intended 
    C tmp = arr[0]; 
    arr[0] = arr[currentSize - 1]; 
    arr[currentSize - 1] = null; 
    currentSize--; 
    return tmp; 
} 

становится:

public C deleteFirst() { // <-- This also doesn't work as intended 
    C tmp = arr[0]; 
    arr[0] = arr[0]; 
    arr[0] = null; 
    currentSize--; 
    return tmp; 
} 

Finaly: обр [0] == утратившим currentSize == 0.

tmp = arr [0] = = Нуль:

public C min(){ 
    C tmp = arr[0]; // <-- This gives tmp a value of null, which is not what I want 

    for(int i = 1; i < currentSize; i++) { // <-- This is skipped entirely as tmp is null 
     if(tmp.compareTo(arr[i]) > 0) { 
      tmp = arr[i]; 
     } 
    } 
    return tmp; 

} 

Вам нужно что-то вроде этого:

public C min() { 
    if (currentSize == 0) { 
     throw new RuntimeException("Size is 0."); 
    } 

    C tmp = arr[0]; // <-- This gives tmp a value of null, which is not what I want 

    for (int i = 1; i < currentSize; i++) { // <-- This is skipped entirely as tmp is null 
     if (tmp.compareTo(arr[i]) > 0) { 
      tmp = arr[i]; 
     } 
    } 
    return tmp; 

} 
Смежные вопросы