2013-03-30 4 views
0

간단한 질문이 있습니다.제네릭 형식 대신 특정 클래스의 LinkedList 구현

내 자신이 정의한 연결된 노드를 사용하여 클래스를 중첩 클래스로 정의하고 있습니다.

이 노드는 제네릭 형식이 아닌 String의 ArrayLists 노드에만 사용합니다.

노드를 제네릭 형식 T, 즉 HNode < T>에 대해 정의했지만 ArrayList의 메서드를 사용하는이 Node 클래스에 메서드를 추가하려고합니다. 예를 들어,

public void forward(int n) { //return boolean?? 
     HNode<T> targetNode; 
     for(int i=0; i<n; i++) { 
      targetNode = this._next; 
     } 
     targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 
    } 

내 Node 클래스 내에 있습니다.

형식 T에 대해 메서드 size()가 정의되어 있지 않다는 경고가 계속 표시되므로 클래스 정의를 Node of ArrayList String으로 변경하는 것이 좋습니다.

(첫 번째 질문은 다음과 같습니다.) 올바른 접근 방법입니까 아니면 더 좋은 방법입니까? 또는 경고를 무시할 수 있습니까?

또 하나의 질문입니다. 변수 targetNode를 선언하고 for 루프 안에 할당했습니다. 그러나 targetNode를 할당해야한다는 경고가 표시됩니다.

더 좋은 옵션일까요?

감사합니다. 대신 HNode<T>

의 HNODE을 :

답변

1

더 좋은 방법이 있습니다.

당신이 Arraylist.size() 방법을 사용하고자하기 때문에, 당신의 노드를 만드는 (수업 포괄)를 Collection 인터페이스의 유형을 건의 할 것입니다.

인터페이스는 객체가 .size() 메소드를 구현했음을 보장하므로 컴파일 오류가 제거됩니다.Collection에서

Arraylist 상속 다음과 같이
Collection-->AbstractList-->Arraylist

클래스를 통해 일반 T 대신에 사용 Collection :이 클래스는 모든 클래스를 처리 할 수 ​​

HNode<Collection> targetNode; 

광범위한 클라이언트 그룹 인 Collection 인터페이스를 구현합니다. 에스. 이것은 당신의 추상화를 유지하고 방금 교체해야 List 인터페이스의 사용 방법을 수 있으려면 단지 Arraylist

+0

내 클래스를 정의했습니다 \t 개인 클래스 HNode { 이것이 작동 할까? – user25409

+0

@ user25409 다음과 같이 private 클래스를 정의하십시오 :'HNode ' –

0

그런 다음 같은 당신의 유형을 작성, 일반, 사용 드롭 "난 단지가 아닌 일반적인 유형 문자열의 ArrayLists의 노드이 노드를 사용하려면" 그리고 Arraylist<String> 필드를 만듭니다.

+0

당신은 HNode >을 의미합니까? 이것은 작동하지 않았고, 그래서 나는이 질문을했습니다. – user25409

+0

죄송합니다 여전히 내 대답을 편집, 지금은 더 나은 :), 귀하의 요구에 맞는가요? – bluevoid

0

에 전체 클래스를 투입 한 후 훨씬 더 많은 코드 재사용 성을 증가

HNode<T> 

HNode<List> 

n = 0 인 경우 for 루프가 실행되지 않으므로 "targetNode를 할당해야합니다."라는 경고가 나타납니다. 그 이유는 targetNode가 지정되지 않았기 때문입니다. 그리고이 라인에서 그게 전부가 왜 shuld 범위 체크를 추가하거나 당신이 NullPointerException이 발생할 수 있습니다

targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 

편집 : 마지막 라인이 논리적으로 잘못된처럼는 또한이 보인다. remove() 메서드는 제거 된 객체 자체가 아니라 작업 결과 (boolean)를 반환합니다. 제거하기 전에이 요소를 명시 적으로 가져 오거나 LinkedList로 컬렉션을 변경하고 removeLast() 메서드를 호출해야합니다.

+0

'Edit :'에 대한 답장 : Javadoc을 검사했고 두 가지 제거 방법이 있습니다. remove()는 부울을 반환하고, remove (int index)는 제거 된 객체를 반환합니다. – user25409

+0

그래, 브라우저 탭을 혼동하고 List 대신 Collection 인터페이스 javadoc을 조사했습니다. 이 실수로 미안합니다. 하지만 그 이유는 List 인터페이스를 사용해야하는 이유이며 Collection은 @awashburn을 제안한 것이 아닙니다. –