2011-03-03 3 views
0

면접을 위해 기본 ADT 자료를 다시 살펴보고 내가있는 동안 자바를 배우면서 두 마리의 새를 죽이려고합니다. 병합 정렬에 대한 간단한 알고리즘을 일반 연결 목록 (직접 작성)으로 작성하려고합니다. 처음 상상했던 것보다 훨씬 어려워졌습니다! 누구든지 나를 도울 수 있습니까? 나는 기초 작업을 밖으로 시작하고 난에 더 먹을수록이 게시물을 업데이트합니다Java generic arguments

다음과 같이 일반 연결리스트에 대한 나의 코드는 다음과 같습니다. 내가 다른이 클래스에 액세스하려고

public class NodeList<T extends Comparable<T> > { 
    private T head; 
    public NodeList<T> tail; 
    public NodeList(T item, NodeList<T> list) { 
    head = item; 
    tail = list; 
    } 

} 

을 다음과 내가 만든 클래스 :

public class MyList<T extends Comparable<T>> { 

    private NodeList<T> nodes; 
    private static int size; 
    public MyList() { 
    nodes = null; 
    } 

    public MyList(T[] array){ 
    for(T item : array) { 
     nodes = new NodeList<T>(item, nodes); 
    } 
    size = array.length; 
    } 


    public void add(T item) { 
    nodes = new NodeList<T>(item, nodes); 
    size++; 
    } 


    public void addEnd(T item) { 
    NodeList<T> temp = nodes; 
    while (temp == null || temp.tail != null) { 
     temp = temp.tail; 
    } 
    size++; 
    temp.tail = new NodeList<T> (item, null); 
    } 

저는 믿습니다, 지금까지, 모든이의 목록의 시작과 끝으로 일반적인를 추가해야하는 추가 및 가산 방법까지 보정 할 수 목록입니다.

내 코드는 계속 :

public static <S extends Comparable<S>> 
    MyList<S> sort(MyList<S> list) { 

    if (size > 1) { 

     MyList<S> left = leftHalf(list); 
     MyList<S> right = rightHalf(list); 
     list = merge(left, right); 
    } 

    return list; 
    } 

    private static <S extends Comparable<S>> 
    MyList<S> merge(MyList<S> left, MyList<S> right) { 

    } 

    private static <S extends Comparable<S>> 
    MyList<S> leftHalf(MyList<S> list) { 
    MyList <S> leftSide = new MyList(); 
    int middle; 
    if(size % 2 == 1) { 
    middle = size +1; 
    } else { 
    middle = size; 
    } 
    for (int countToMiddle = 0; countToMiddle < middle ; countToMiddle++) { 
     leftSide.addEnd(nodes); 
    } 


    // return elements from 0 .. list.size()/2 
    } 

그리고 오류 얻을 :

addEnd(S) in MyList cannot be applied to (NodeList)

내가

leftSide.addEnd(nodes);

사람이 이유를 볼 수/말 실행할 때 발생 내 일의이 시점까지 내가 맞으면 나? 다시 한번 고마워요! 당신이 Comparable를 사용하는 경우 대체

public class NodeList<T extends Comparable> { 

또는

public class NodeList<T extends Comparable<T>> { 

: 그리고 당신은 단지 Comparable 항목을 포함 할 수있는 NodeList와 myList를 원하는 경우

+0

'T'와 'Comporable'의 관계에 대해 생각해보십시오. – PeterT

+0

질문의 두 번째 버전은'MyList leftSide'가'MyList leftSide'이어야합니다. 원시 타입을 포함한 경고를 없애라. (나는 그것이 현재의 JDK6에 있다고 생각한다.) –

+0

불행히도, 수정 된 편집, 여전히 MyList에서 addEnd (S) 오류가 발생했습니다. (NodeList )에 적용 할 수 없습니다! 다시 한번 감사드립니다 :) –

답변

2

, 당신은 같은과 일반 매개 변수 T을 대체 할 수 T. 이렇게하면 T가 최소한 Comparable의 메소드를 구현한다는 것을 알 수 있습니다.

오라클의 tutorials for generics은 문제를 해결하는 데 도움이 될 것입니다. ,

for (int countToMiddle = 0; countToMiddle < middle ; countToMiddle++) { 
     leftSide.addEnd(nodes); 
    } 

nodes는 멤버 변수, 즉 비 정적 변수 : 당신이 가진 수 있습니다


하나의 문제는 leftHalf에 당신이 좋아하면, 정적 함수에서 멤버 변수를 참조한다는 것입니다 따라서 정적 메서드에서 호출 할 수는 없습니다.

for (int countToMiddle = 0; countToMiddle < middle ; countToMiddle++) { 
     leftSide.addEnd(list.nodes); 
    } 

을 그리고 같은 멤버 변수를 사용하려고 다른 정적 메소드에 간다 : 그 예를 들어, 전달 MyList에서 그것을 얻을해야 할 것이다.


또한,이 같은 오류가 발생하는 이유 : S이기 때문에 addEnd(S) in MyList<S> cannot be applied to (NodeList<T>)는 형식 매개 변수, 필적에 따르면,. NodeList는 확장 할 수 없습니다!당신이

두 솔루션은 당신이 MyList.addEnd

  • 과부하를 만들기 위해 전달할 수 있도록

    1. 만들기가 Comparable를 확장 노드 목록 (즉, 같은 이름을 가진 다른 방법) NodeList를 소요 가수에 대한, 전달 된 NodeList의 모든 항목을 MyList에 추가하십시오.

    또는 클래스 필요성에 맞는 다른 솔루션을 제안하십시오. 내가 방금 인터뷰 (나는 당신에게 행운을 기원합니다!)에 대한 기술을 선명하게 연결리스트를 구현하고 실현하는 동안


    은, 그냥 자바에서 이미 사용할 수있는 제네릭 LinkedList이 있음을 추가 할.

  • +0

    꼬리말의 선언을'private NodeList tail;으로 수정하고 NodeList 생성자의 서명을'public NodeList (T item, NodeList list)'로 변경하는 것이 좋습니다. 두 번째 인수). –

    +0

    답변 해 주셔서 대단히 감사합니다. 새로운 문제를 보여주기 위해 내 게시물을 수정했습니다.다시 고마워요 :) –

    +0

    '>'(현재의 질문에있는 코드는 원본과 다릅니다.) –

    1

    왜 거의 같은 질문을 두 번 게시합니까? 질문을 연장하고 의견을 추가 할 수 있습니다.

    우리는 이미 그걸 hint이라고했습니다. :)

    +0

    기존 계정에 로그인 할 수 없어 새로운 질문이있었습니다! :) 답장을 보내 주셔서 감사합니다 :) –

    +0

    +1 나는 중복을 확인 했어야했습니다 : - P도 오 –

    +0

    그 힌트는 훌륭합니다, 감사합니다! 중복에 대한 사과! –

    0

    NodeList 클래스에 일반 T 클래스 및 NodeList를받는 생성자가 없으므로 오류가 발생합니다. 실제로이 구현은 노드가 모든 루프에서 참조하는 참조 객체를 대체합니다. 또한 수정해야합니다.

    유사한 자체, 그리고, 같은 속성을 변경하려면 T를 넣어 당신은 무엇을해야합니까 : 당신이 정확하게 코드가 무엇인지 우리에게 말한다면 그것은 더 나은 것

    public class NodeList<T extends Comparable> { 
        private T head; 
        private NodeList tail; 
        public NodeList(T item, NodeList list) { 
         head = item; 
         tail = list; 
        } 
    } 
    

    합니다.

    +0

    '>'(현재 질문의 코드는 원본과 다르다는 점에 유의하십시오.) –

    +0

    편집했습니다. http://stackoverflow.com/posts/5185577/revisions – bluefoot

    관련 문제