Как напечатать реализованную PriorityQueue в виде строки? - PullRequest
0 голосов
/ 06 ноября 2019

Я создаю PriorityQueue без использования класса PQ в Java, и методы get и put работают как задумано, к сожалению, метод toString() не проходит мои тестовые случаи, и я не могу ничего напечататьна консоль. Я совершенно заблудился в том, в чем проблема, поскольку методы get () и put () работают нормально, но приведенные несколько тестовых примеров не проходят. Мой код:


private int priority;
private String data;

Element(int priority, String data) { 
    // Ihr Code
    this.priority = priority;
    this.data = data;

 }

public String getData() { 
    // Ihr Code
    return data;
}


public int getPriority() { 
    // Ihr Code
    return priority;
 }

/**
 * Return data and priority as string 
 * Format: Data (Priority)
 * e.g: abc (7)
 */
public String toString()        {
    String str = data + " " + Integer.toString(priority) + ")";  
    return str;
}
}


public class PriorityQueue {


static final int SIZE = 32;


private Element[] data = null;

// actual number of entries
private int len = 0;


/**
 * Creates a new PriorityQueue
 */
public PriorityQueue() {
     data = new Element[SIZE];     
}

/** 
 * Adds a new element into the queue as long as there is space
 * Returns true if element could be added, otherwise false 
 */
boolean put(Element element) {
    // Ihr Code
    if (len == SIZE) {
        return false;
        }else if (len > 0 && len < SIZE){
            int i = len;
            while (i > 0 && element.getPriority() > data[i-1].getPriority()){
                data[i] = data[i-1];
                i--;
            }
            data[i] = element;
            len++;

            return true;
        }else{
            return false;
        }

}

/**
 * Returns element with the highest priority 
 * and removes it from the queue. Otherwise returns null
 * 
 */
Element get() {
    // Ihr Code
         if(len==0){
            return null;
            }else if (len > 0){ 
              Element x = data[0];
              for(int i = 1; i < len; i++){
                 data[i-1] = data[i];
            }
            --len;
            return x;
            }else{
                 return null;
            }
    }

/**
 * Number of entries 
 */
int length() {
    // Ihr Code
    return len;
 }

/**
 * Returns contents of the queue as a String
 * Format: data1 (priority1), data2 (priority2)
 * e.g: abc (7), cde (8)
 * Attention: There should be no comma at the end of the String 
 */
public String toString() {
    //  Code
    StringBuilder sb = new StringBuilder();
         for (int i = 0; i < data.length; i++){
             sb.append(data[i]).append(",");
         }
         if(sb.length() > 0){
             sb.deleteCharAt(sb.length()-1);
         }
        String res = sb.toString();

        return res; 
 }

Я могу прекрасно скомпилировать программу, но ничего не печатается так, как задумано. Мои тесты, такие как

        pq.put(new Element(3, "hello"));
        pq.put(new Element(7, "world"));
        String pqAsString = pq.toString().replace(" ", "");
        assertTrue(pqAsString.contains("hello"));

Судья говорит, что assertTrue не проходит. Кроме того, другой тестовый пример assertEquals(gt.getPriority(), e.getPriority()); также не работает, и я не получаю вообще. gt и e являются элементами, определенными в методе, без дальнейшего объявления.

Буду очень признательна за любую помощь в улучшении моего PQ или за помощь в использовании метода toString! Благодарю.

1 Ответ

0 голосов
/ 07 ноября 2019

в вашем методе put() вам нужен еще один else if блок:

} else if(len==0) {
    data[0] = element;
    len++;
}

Я реорганизую этот метод, как показано ниже. Это более читабельно.

public boolean put(Element element) {
    // Ihr Code
    if(len >= SIZE) {
        return false;
    }else {
        data[len]=element;
        Element temp;
        for(int i=len; i>0; i--) {
            if(data[i].getPriority()>data[i-1].getPriority()) {
                temp=data[i];
                data[i]=data[i-1];
                data[i-1]=temp;
                i++;
            }
        }
        len++;
        return true;
    }
}

Вы также можете добавить if блок к toString() - распечатка будет лучше

for (int i = 0; i < data.length; i++){
     if(data[i]!=null) {
        sb.append(data[i]).append(",");
    }
 }
...