2011-04-22 7 views
0

제 데이터 구조 클래스의 경우 숙제는 일반 힙 ADT를 만드는 것입니다. siftUp() 메소드에서 비교를해야하며 부모가 더 작 으면 스왑을 수행해야합니다. 내가 겪고있는 문제는 비교 연산자가 제네릭 형식에 유효하지 않다는 것입니다. 필자는 Comparable 인터페이스를 사용해야한다고 생각하지만 배열에서 사용하는 것은 좋지 않습니다. 나는이 사이트를 검색하고 나는 그들의이 게시물 것도 일반 힙의 비교 연산자

내가 관련되지 않았 음을 코드의 일부를 제거 해결책을 찾기 나를 도왔에 관련된 좋은 정보를 발견 감사

public class HeapQueue<E> implements Cloneable { 
    private int highest; 
    private Integer manyItems; 
    private E[] data; 

    public HeapQueue(int a_highest) { 
     data = (E[]) new Object[10]; 
     highest = a_highest; 

    } 

    public void add(E item, int priority) { 
     // check to see is priority value is within range 
     if(priority < 0 || priority > highest) { 
     throw new IllegalArgumentException 
      ("Priority value is out of range: " + priority); 
     }  
     // increase the heaps capacity if array is out of space 
     if(manyItems == data.length) 
     ensureCapacity(); 
     manyItems++; 
     data[manyItems - 1] = item; 
     siftUp(manyItems - 1); 
    } 

    private void siftUp(int nodeIndex) { 
     int parentIndex; 
     E tmp; 
     if (nodeIndex != 0) { 
      parentIndex = parent(nodeIndex); 
      if (data[parentIndex] < data[nodeIndex]) { <-- problem **** 
        tmp = data[parentIndex]; 
        data[parentIndex] = data[nodeIndex]; 
        data[nodeIndex] = tmp; 
        siftUp(parentIndex); 
      } 
     } 
     } 

    private int parent(int nodeIndex) { 
     return (nodeIndex - 1)/2; 
    } 
} 

답변

0

는, E는 단순히 Comparable을 확장 할 필요가 다음 문제 라인이됩니다.

+0

내가 비교를 E 확장 할 때 생성자에서 캐스팅 오류가 발생합니다 data = (E []) new Object [10]; [Ljava.lang.Object; [Ljava.lang.Comparable; 클래스 HeapQueue > – Chad

+0

@Char : 대신 ArrayList 을 사용하십시오. –

+0

캐스팅 오류를 발견했습니다 ... Object를 Comparable 유형으로 변경하는 것을 잊었습니다. 도움을 주셔서 감사합니다 – Chad

1

기술적 당신은 항목이 아니라 배열을 사용하여 비슷한 인터페이스를 사용하고 있습니다. 배열의 항목 하나가 구체적입니다. 가장 좋은 해결책은 생성자에서 사용자가 일반 객체를 비교할 수있는 Comparator를 허용하는 것입니다.

Comparator<E> comparator; 
public HeapQueue(int a_highest, Comparator<E> compare) 
{ 
    this.comparator = compare; 

그런 다음 멤버 함수에서 그 비교를 저장하고 운전자보다 적은 대신에

if (comparator.compare(data[parentIndex],data[nodeIndex]) < 0) 

을 사용합니다. 이것은 내가 알고 베팅 사례 규칙을 위반하지 않는

if (data[parentIndex].compareTo(ata[nodeIndex]) < 0) 

... 나는이 권리를 읽고 있습니다 경우

+0

이전에 Comparator를 사용하지 않았습니다. 생성자에이를 어떻게 추가합니까? 감사합니다 – Chad

+0

예제에서 편집했습니다 – Ben