繁体   English   中英

通用对象获取空值而不是双精度值

[英]Generic Object obtaining null value rather than a double value

因此,此代码的目的是使用已排序数组创建优先级队列。

当前,我有一个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(); 

}

测试结束时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;
}

终结:arr [0] == null和currentSize == 0。

tmp = arr [0] == null:

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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM