2013-10-08 2 views
0

나는 인터페이스를 구현하는 클래스가 있는데 배열에 요소를 두 번 이상 삽입하려고하면 첫 번째 삽입을 잊어 버리려고합니다. 나는이 것을 이해할 수 없다. 배열에 요소 삽입

public void insertElementAt(int index, E el) 
       throws IllegalArgumentException { 

    Object temp[] = new Object[data.length + 1]; 
    for (int i = 0; i < data.length; i++) { 
     if (i == index){ 
      temp[index] = el; 
      temp[i + 1] = data[i]; 
      i++; 
     } 

     temp[i] = data[i]; 
    } 

    data = temp; 

    if (index > data.length || index < 0) { 
     throw new IllegalArgumentException(); 
    } 
} 

그런 다음 내 테스트는 그가 마지막 주장에 대신 처음의 null를보고

: 이것은 내가 가지고있는 것입니다.

@Test 
public void testInsertToLeft() { 
    PriorityList<String> list = new ArrayPriorityList<String>(); 
    list.insertElementAt(0, "First"); 
    // Must shift array elements in this case 
    list.insertElementAt(0, "New First"); 

    assertEquals("New First", list.getElementAt(0)); 
    assertEquals("First", list.getElementAt(1)); 
} 
+1

인덱스가 필요합니다. 이전 배열과 새 배열에 하나씩 필요합니다. 그대로, 삽입으로 인해 하나의 요소를 건너 뛸 때 _both_ 배열을 건너 뜁니다. 추신 'List' 만 사용하십시오. –

+0

'if' 블록의 끝에서'continue'가 필요합니다. – Admit

+0

'데이터 '의 첫 번째 크기는 무엇입니까? –

답변

1

당신은 다음과 같이 수행해야합니다

public void insertElementAt(int index, E el) throws IllegalArgumentException { 

    Object temp[] = new Object[data.length + 1]; 
    for (int i = 0; i < data.length; i++) { 
     if (i >= index){ 
      temp[i + 1] = data[i]; 
     } else { 
      temp[i] = data[i]; 
     } 
    } 
    temp[index] = el; 
    data = temp; 

    if (index > data.length || index < 0) { 
     throw new IllegalArgumentException(); 
    } 
} 

그것을 제거하려면 :

public void removeElementAt(int index) throws IllegalArgumentException { 

    Object temp[] = new Object[data.length - 1]; 
    for (int i = 0; i < temp.length; i++) { 
     if (i > index){ 
      temp[i - 1] = data[i]; 
     } else { 
      temp[i] = data[i]; 
     } 
    } 
    data = temp; 

    if (index > data.length || index < 0) { 
     throw new IllegalArgumentException(); 
    } 
} 
+0

나는 기존의 코드를 너무 많이 바꾸지 않고 쉬운 수정을했다는 것을 알았습니다.하지만 알아낼 수 없었습니다. –

+0

오! 많은 감사합니다 @ KevinDiTraglia :-) –

+0

완벽한. 배열에서 원소를 제거하고 그것을 옮기는 것과 비슷한 것을 할 수 있을까요? – Tejas

0

시도하는 루프에 대한 귀하의 변화 중 하나

for (int i = 0; i < data.length; i++) { 
      if (i == index){ 
       temp[index] = el; 
       temp[i + 1] = data[i]; 
       i++; 
      }else{ 
       temp[i] = data[i]; 
      } 

} 

또는

for (int i = 0; i < data.length; i++) { 
     if (i == index){ 
      temp[index] = el; 
      temp[i + 1] = data[i]; 
      i++; 
      continue; 
     } 
     temp[i] = data[i]; 
    } 
0

목록이 비어있을 때 data.length입니다 무엇입니까? 처음 삽입 할 때 비어있는 경우 for 루프를 입력하지 않고 임시 배열을 복사하면 길이가 1 인 다음 삽입시 루프로 이동합니다. 첫 번째 삽입은 건너 뜁니다.

0

내가 이런 짓을 했을까 :

public static void insertElementAt(int index, E el) 
    throws IllegalArgumentException { 

if (index > data.length || index < 0) { 
    throw new IllegalArgumentException(); 
} 

Object temp[] = new Object[data.length + 1]; 
for (int i = index; i < data.length; i++) { 
    temp[i+1] = data[i]; 
} 
temp[index] = el; 
data = temp; 

을}

0

당신은 테스트를해야한다 유효한 매개 변수 ("fa 김정일 초 "), 그리고 당신은 JDK의 유틸리티 방법을 잘 활용을 할 수 있습니다 당신을 위해 리프팅을 수행

public static void insertElementAt(int index, E el) { 
    if (index > data.length || index < 0) { 
     throw new IllegalArgumentException(); 
    } 

    data = Arrays.copyOf(data, data.length + 1); 
    System.arrayCopy(data, index, data, index + 1, data.length - index); 
    data[index] = el; 
} 

은 또한 당신이 throws를 선언 할 필요가 없습니다, IllegalArgumentException되지 않은 예외가 있기 때문에, 그래서 나는 그것을 제거했다. 보통이 패턴을 따른다.