如何停止此循环更改值?

时间:2019-09-16 11:46:53

标签: java

我正在尝试在已创建的对象数组上实现堆排序。它打算根据其eventTime属性进行排序,但是在对队列进行排序时,每个eventTime属性都将设置为与其他属性相同。有什么方法可以解决此问题,使其按升序创建“优先级队列”?

主要:

public static void main(String[] args) {

    CustomerQueue cQ = new CustomerQueue(0, 0, false);

    for (int i = 0; i < 10; i++) {
        CustomerQueue cQ1 = new CustomerQueue(0, 0, false);
        cQ.enqueue(cQ1);
        System.out.println(cQ1.arrivalTime);
    }

    System.out.print("\n");

    PriorityQueue pQ = new PriorityQueue(0, 0, 0, false);

    while (!cQ.isEmpty()) {
        for (CustomerQueue c : cQ.array) {
            PriorityQueue pQ1 = new PriorityQueue(0, 0, 0, false);
            pQ1.eventTime = c.arrivalTime;
            pQ.enqueue(pQ1);
            System.out.println(pQ1.eventTime);
            cQ.dequeue();
        }
    }
    pQ.sort(pQ.array);
    System.out.println(Arrays.toString(pQ.array));
}

PriorityQueue:

class PriorityQueue {

PriorityQueue array[] = new PriorityQueue[10];
private int front;
private int rear;
private int count;
private int eventType;
double eventTime;
private double tallyTime;
private boolean paymentMethod;

public PriorityQueue(int evT, int eT, double tT, boolean pM) {
    this.eventType = evT;
    this.eventTime = eT;
    this.tallyTime = tT;
    this.paymentMethod = pM;
    front = 0;
    rear = -1;
    count = 0;
}

public void enqueue(PriorityQueue pQ) {
    if (isFull()) {
        System.out.println("OverFlow\nProgram Terminated");
        System.exit(1);
    }

    rear = (rear + 1);
    array[rear] = pQ;
    count++;
}

public void sort(PriorityQueue arr[]) {
    int n = arr.length;

    // Build heap (rearrange array) 
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // One by one extract an element from heap 
    for (int i = n - 1; i >= 0; i--) {
        // Move current root to end 
        int temp = (int) arr[0].eventTime;
        arr[0] = arr[i];
        arr[i].eventTime = temp;

        // call max heapify on the reduced heap 
        heapify(arr, i, 0);
    }
}

void heapify(PriorityQueue arr[], int n, int i) {
    int largest = i; // Initialize largest as root 
    int l = 2 * i + 1; // left = 2*i + 1 
    int r = 2 * i + 2; // right = 2*i + 2 

    // If left child is larger than root 
    if (l < n && arr[l].eventTime > arr[largest].eventTime) {
        largest = l;
    }

    // If right child is larger than largest so far 
    if (r < n && arr[r].eventTime > arr[largest].eventTime) {
        largest = r;
    }

    // If largest is not root 
    if (largest != i) {
        int swap = (int) arr[i].eventTime;
        arr[i] = arr[largest];
        arr[largest].eventTime = swap;

        // Recursively heapify the affected sub-tree 
        heapify(arr, n, largest);
    }
}

public void dequeue() {
    if (isEmpty()) {
        System.out.println("UnderFlow\nProgram Terminated");
        System.exit(1);
    }

    front = (front + 1) % array.length;
    count--;
}

public boolean isEmpty() {

    return (size() == 0);
}

public int size() {
    return count;
}

public boolean isFull() {
    return (size() == array.length);
}

public PriorityQueue peek() {
    if (isEmpty()) {
        System.out.println("UnderFlow\nProgram Terminated");
        System.exit(1);
    }
    return array[front];
}

@Override
public String toString() {
    return eventType + " " + eventTime + " " + tallyTime + " " + paymentMethod;
}

}

1 个答案:

答案 0 :(得分:1)

我看到了最有可能是错误的两个部分以及导致您问题的原因:

heapify方法中,您可以:

int swap = (int) arr[i].eventTime;
arr[i] = arr[largest];
arr[largest].eventTime = swap;

sort方法中,您可以:

int temp = (int) arr[0].eventTime;
arr[0] = arr[i];
arr[i].eventTime = temp;

假设您要在数组内部切换CustomerQueue对象,则应该改为:

// In the heapify:
CustomerQueue swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;

// In the sort:
CustomerQueue temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;

您的代码当前以伪代码执行的操作是这样的:

CustomerQueue ith例如有name = "I", eventTime = 1
CustomerQueue largest例如有name = "largest", eventTime = 2

int temp = (int) arr[i].eventTime; // temp is now 1
arr[i] = arr[largest]; // Both arr[i] AND arr[largest] are now CustomerQueue largest (with name = "largest" and eventTime = 2)
arr[i].eventTime = temp; // Both arr[i] AND arr[largest] are now changed to eventTime temp (which is 1)

因此,arr[i]arr[largest]现在都将保持:name = "largest" and eventTime = 1以及 引用 相同的CustomerQueue实例。