우선, 많은 질문과 튜토리얼을 읽고 비디오를 보면서 언급해야하지만 여전히 문제는 해결되지 않았습니다.CompareTo 잘못된 반환 값
저는 Java의 중간 프로그래머입니다. 요소를 [Comparable element, int priority]와 같이 유지하는 우선 순위 큐에서 요소를 비교하기위한 코드를 작성했습니다. 분명히 우선 순위가 높아질 것입니다.
문제 : 우선 순위가 가장 높은 첫 번째 요소를 갖도록 코드를 수정했으며 작동하지 않습니다! 두 개의 요소를 비교할 때 compareTo 메서드는 0을 반환하므로 코드가 실패합니다.
이
는 O의 푸시을 가지고있는 클래스 (1) 및 O의 팝 (N) :public class PriorityQueueU<T>
{
public class PriorityPair implements Comparable
{
public Comparable element;
public Comparable priority;
public PriorityPair(Comparable element, int priority){
this.element = element;
this.priority = priority;
}
public Comparable<T> getElemet(){
return this.element;
}
public Comparable<T> getPriority(){
return this.priority;
}
public int compareTo(Comparable a)
{
PriorityPair p2 = (PriorityPair)a;
return ((Comparable)priority).compareTo(p2.priority);
}
public String toString(){
String s1 = this.element.toString();
String s2 = this.priority.toString();
String res = "[ " + s1 + ", " + s2 + " ]" ;
return res;
}
public int compareTo(Object o)
{
// TODO Auto-generated method stub
return 0;
}
}
private LinkedList data;
public PriorityQueueU()
{
data = new LinkedList();
}
public void pushUnsorted(Comparable<T> o, int priority)
{
PriorityPair paired = new PriorityPair(o, priority);
data.addLast(paired);
}
public Comparable popUnsorted()
{
int index = 0;
for (int i = 0; i < this.data.size() - 1; i++)
{
if (((PriorityPair) this.data.get(i)).compareTo(this.data.get(i + 1)) < 0)
{
index = i + 1;
}
}
PriorityPair pp = (PriorityQueueU<T>.PriorityPair) this.data.get(index);
this.data.deleteIt(index);
return pp.getElemet();
}
public String toString(){
return this.data.toString();
}
}
}
이이 동작을 테스트 할 코드입니다 :
PriorityQueueU<T> unSortedPQ = new PriorityQueueU<>();
unSortedPQ.pushUnsorted((Comparable<T>) "a", 1000);
unSortedPQ.pushUnsorted((Comparable<T>) "b", 200);
unSortedPQ.pushUnsorted((Comparable<T>) "j", 900);
unSortedPQ.pushUnsorted((Comparable<T>) "r", 9);
unSortedPQ.pushUnsorted((Comparable<T>) "z", 6);
System.out.println("the UNsorted priority Q: ");
System.out.println(unSortedPQ);
System.out.println("*#------------------END OF PUSH-----------------#*");
System.out.println();
System.out.println("the priority Q: " + unSortedPQ);
System.out.println("popped item is: " + unSortedPQ.popUnsorted());
// System.out.println("top of the priority queue is: " + uPriorityQueueU.top());
System.out.println();
System.out.println("the UNsorted priority Q: ");
System.out.println(unSortedPQ);
System.out.println("*#------------------END OF POP-----------------#*");
System.out.println();
을 미리 감사드립니다.
P. 아마 내가 틀렸고 문제가 다른 곳에서 있었던 것을 명심하십시오! 현재 동작 : 목록에서 두 번째로 높은 요소 인 j를 팝합니다. 나는 이미 터질 때 요소가 링크 목록에 저장된 우선 순위 큐에서 삭제되어야한다는 것을 이미 알고 있습니다. 연결된 목록의 삭제가 올바르게 작동하는지 확인했지만 필요한 경우 주저하지 말고 코드를 요청하십시오.
당신은 확실히 틀린 것처럼 보이는 두 개의 'compareTo' 메소드가 있습니다. – Marvin
마빈의 코멘트에 덧붙이 자면, 비교가 잘못된 compareTo 메소드에서 구현됩니다. –
친애하는 Robin, 저는 이것이 잘못된 것으로 구현되었다는 것을 알고있었습니다. 그 이유는 무엇입니까! 시간 내 주셔서 감사합니다. – Kayvan