2017-05-01 7 views
0

우선, 많은 질문과 튜토리얼을 읽고 비디오를 보면서 언급해야하지만 여전히 문제는 해결되지 않았습니다.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를 팝합니다. 나는 이미 터질 때 요소가 링크 목록에 저장된 우선 순위 큐에서 삭제되어야한다는 것을 이미 알고 있습니다. 연결된 목록의 삭제가 올바르게 작동하는지 확인했지만 필요한 경우 주저하지 말고 코드를 요청하십시오.

+0

당신은 확실히 틀린 것처럼 보이는 두 개의 'compareTo' 메소드가 있습니다. – Marvin

+0

마빈의 코멘트에 덧붙이 자면, 비교가 잘못된 compareTo 메소드에서 구현됩니다. –

+0

친애하는 Robin, 저는 이것이 잘못된 것으로 구현되었다는 것을 알고있었습니다. 그 이유는 무엇입니까! 시간 내 주셔서 감사합니다. – Kayvan

답변

1

compareTo이 작동하려면 Comparable 인터페이스에서 제공하는 방법을 구현해야합니다. 우리는 위의 코드에서 보듯이

public interface Comparable<T> { 
    public int compareTo(T o); 
} 

Copmarable는 제네릭을 지원합니다. 당신은 당신이 (그대로두고) 비교하려는 객체의 유형을 지정하지 않으면, 그것이 수행하는 Object로 설정됩니다 (즉, 사용자 코드에서의) :

public int compareTo(Object o) 
{ 
    // TODO Auto-generated method stub 
    return 0; 
} 

그래서 하나가 제네릭 사용하거나 compareTo(Object o)에 대한 논리를 작성하십시오.

+0

친애하는 Cargeh, 나는 그것에 대한 논리를 작성했지만 구현되지 않았습니다. 잘못된 compareTo 메서드를 삭제하면 오류가 발생합니다. 나는 이것이 잘못되었다는 것을 잘 알고 있지만, 두 번째 방법 대신 올바른 방법을 사용하는 방법을 시행하는 방법을 모르겠습니다. 그것이 문제이다! – Kayvan

+2

친애하는 @Kayvan, 내가 말했듯이 제네릭을 사용해보십시오. '... implements Comparable '이면, 작성한 메소드를 사용해야합니다. 그렇지 않으면 위에서 언급 한 것처럼'Object'가 기본값이됩니다. 제 대답을 다시 읽어주세요. – Cargeh