2012-03-04 7 views
0

add 및 get 메서드가있는 SortedIntList 클래스를 작성했습니다.ArrayList 이동

나는 다음과 같은 네 가지 방법을 호출 오전 :

SortedIntList mySortedIntList = new SortedIntList(); 
mySortedIntList.add(9); 
mySortedIntList.add(7); 
System.out.println("0 is :"+mySortedIntList.get(0)); 
System.out.println("1 is :"+mySortedIntList.get(1)); 

내 GET 및 메소드를 추가는 다음과 같습니다

public void add(Integer newValue) { 
    int position = 0; 
    while(position < list.size()){ 
     int currentPosValue = list.get(position); 
     if(newValue <= currentPosValue){ 
      for(int i=list.size()-1; i>=position; i--){ 
       int toBeShifted = list.get(i); 
       list.set(i+1, toBeShifted); 
      } 
      list.set(position, newValue); 
      return; 
     } 
     position++; 
    } 
    list.add(newValue); 
} 


     public int get(int i) throws IndexOutOfBoundsException { 
    // Postcondition: If i < 0 or i >= size() throws 
    // IndexOutOfBoundsException, otherwise returns the value 
    // at position i of this IntList 
    if (i < 0 || i >= list.size()) { 
     throw new IndexOutOfBoundsException("SortedIntList.get"); 
    } else { 
     return ((Integer) list.get(i)).intValue(); 
    } 
} 





    public int get(int i) throws IndexOutOfBoundsException { 
     // Postcondition: If i < 0 or i >= size() throws 
     // IndexOutOfBoundsException, otherwise returns the value 
     // at position i of this IntList 
     if (i < 0 || i >= list.size()) { 
      throw new IndexOutOfBoundsException("SortedIntList.get"); 
     } else { 
      return ((Integer) list.get(i)).intValue(); 
     } 
    } 

내가 종이에 그것을 밖으로 작성한, 그것은 논리적 인 것 같다,하지만 코드가 폭발하다 :

System.out.println("1 is :"+mySortedIntList.get(1)) 줄은 분명히 1이지만, 나는 어떻게 보이지 않는다.

+0

분명히 코드 태그를 잘못 추가했는데 어떻게 해결할 수 있습니까? –

+0

이 포럼에서는 [code] [/ code] 태그를 사용하지 않으므로 FAQ를보고 싶을 것입니다. 대신 {} 코드 버튼을 누르면 코드 4 칸을 들여 쓰게됩니다. –

+0

당신은'get'이 아닌'add' 메소드를 게시했습니다. – talnicolas

답변

0

Collections.sort()을 사용하는 것이 더 쉬울 수도 있지만이 표준 Java 메소드는 컬렉션을 정렬합니다. 이렇게하면 자신을 정렬해야하는 번거 로움을 처리 할 필요가 없습니다!

+0

나는 그것을 할 것이지만 그것의 데이터 구조 코스, 그래서 나는 허용되지 않는다 :-( –

+0

"숙제"태그를 추가하여 모두가 당신을 위해 문제를 완전히 해결하지 못하도록 할 수있다. –

+0

왜 너는하지 않니? 당신의 코스 강사에게 물어 봐요? 그게 네가 지불하는 곳이야, 맞지? 행운을 빌어! – Wesley

0

몇 가지 문제가 있습니다.

먼저 list.set(i+i, toBeShifted);list.set(i+1, toBeShifted);이어야합니다. 목록에 7을 추가하면 목록 크기는 1이됩니다. for 루프에서 i는 0 (목록 크기 - 1)으로 초기화됩니다. list.set (i + i, toBeShifted)를 호출하면 list.set (0, toBeShifted)을 호출하므로 실제로 값을 이동시키지 않습니다.

둘째, 9를 추가하고 7을 추가하지 않아도 무한 루프가 끝납니다. 당신은 위치의 가치를 절대로 바꿀 수 없습니다. 9를 더한 다음 더 큰 숫자를 더하면 hose입니다.

+0

맞아, 나는 i + 1이 아닌, + i가 아닌 무한 루프 (가능한) 문제를 수정했다. 여전히 내 문제가 무엇인지 보지 못했습니다. 문제가 해결 된 후에도 여전히 같은 오류가 발생합니다. –

+0

테스트를 작성했습니다 : ArrayList a = new ArrayList(); a.add (1); a.set (1,0);이 thro 스레드 "주"에서 예외가 발생했습니다. java.lang.IndexOutOfBoundsException : 인덱스 : 1, 크기 : 1 어떻게 될 수 있습니까? –

+0

목록.set "이리스트의 지정된 위치의 요소를 지정된 요소로 옮겨 놓습니다." 7을 설정할 때 위치 1에 아무 것도 없으므로 대체 할 항목이 없습니다. 이것은 충돌의 원인입니다. for 루프를 시작하기 전에 목록에 새 항목을 추가해야합니다 (목록의 끝에 추가됨). 그리고 나서 교대를 할 때 숫자가 나올 자리가 있습니다. 이 시점 이전에리스트의 크기가 1 씩 증가하기 때문에 for 루프를'for (int i = list.size() - 2; i> = position; i -) {'로 변경해야 할 것이다. – Tony

1

Java Doc를 읽는 것이 도움이됩니다. 분명히 set()을 사용하면 이미 재정의하려는 위치에 값이 있어야합니다. 대신에 add (position, value)를 사용해야합니다 :-)

0

목록에 추가하려면 목록의 set()을 사용할 수 없습니다. 예를 들어 인덱스 1에있는 항목을 크기 목록의 항목으로 설정하려고하면 1 일 경우 IndexOutOfBoundsException이 표시됩니다.

기본적으로 add이 필요합니다.