2013-10-08 5 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

Похоже, вам нужны _two_ indexes - один для старого массива и один для нового массива. Как бы то ни было, когда вы пропускаете один элемент из-за вставки, вы пропускаете _both_ массивы. Постскриптум просто используйте «Список». –

+0

Кажется, вам нужно 'continue' в конце блока' if'. – Admit

+0

Что такое первый размер 'data'? –

ответ

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

Я понял, что было легко исправить, не изменяя слишком много его существующего кода (Но я не мог понять, что это получается), хороший ответ +1. –

+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, а скопируете массив temp, он перейдет в цикл при следующей вставке с длиной 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 является бесконтрольно исключения, поэтому я удалил его. Как правило, следует следовать этой схеме.

Смежные вопросы