2015-10-19 3 views
0

Я пытаюсь создать метод, который ищет в массиве данных, чтобы найти строку «elt». Если он существует, он перемещает все элементы после «elt» в одну позицию влево (чтобы покрыть ячейку, где существовал «elt»).Как перемещать элементы в массиве?

Я могу найти все экземпляры «elt» и установить их в нуль, но у меня возникают проблемы с перемещением всех элементов, прошедших «elt», на одно место в массиве. Код ниже - это то, что у меня есть до сих пор.

public class Bag<T> implements Iterable<T> { 

private final int MAXLEN = 3; 
private int size; 
private T[] data; // array 

public T remove(T elt) { 

     for (int i=0; i<data.length; i++) { 
      if ("elt".equals(data[i])) { 
       data[i] = null; 

       for (i++; i < data.length; i++) { 
        data[i] = data[i-1]; 
       } 
      } 
     } 
public static void main(String[] args) { 
     Bag<String> sbag = new Bag<String>(); 

     sbag.add("Noriko"); 
     sbag.add("Buddy"); 
     sbag.add("Mary"); 
     sbag.add("Peter"); 
     sbag.add("elt"); 
     sbag.add("hello"); 

    Iterator<String> it = sbag.iterator(); 
     while (it.hasNext()) { 
      String val = it.next(); 
      System.out.println(val); 
     } 

    sbag.remove("elt"); 

    Iterator<String> it2 = sbag.iterator(); 
     while (it2.hasNext()) { 
      String val = it2.next(); 
      System.out.println(val); 
     } 
} 

Когда я запускаю этот код, я получаю:

Норико Buddy Мэри Питер еи привет Норико Buddy Mary Peter нулевой

Однако, я ожидал

Норико Buddy Мэри Питер еи привет Норико Buddy Мэри Питер привет

Может кто-нибудь сказать мне, как я могу исправить код так, чтобы остальная часть элементов массива сдвигаются вниз? Я думаю, проблема в моем методе удаления.

+0

Почему ваш ожидаемый результат содержит' 'etl' и hello' вместо «null»? – sam

+0

Он должен напечатать норико Бадди Мэри Питер, поздоровавшись с первым итератором. Затем, со вторым итератором, я хочу, чтобы он напечатал «Норико Бадди Мэри Питер», потому что он удаляет elt из массива и смещает его на место. Однако это не так. –

ответ

1

Если я понимаю, что вы пытаетесь правильно достичь, вы сдвигая неправильный путь вы хотите:

public T remove(T elt) { 

    for (int i=0; i<data.length; ++i) { 
     if (elt.equals(data[i])) { 
      data[i] = null; 
      for (++i; i < data.length; ++i) { 
       data[i-1] = data[i]; 
      } 
      break; 
     } 
    } 

`

+0

Это сработало, спасибо! Не могли бы вы объяснить, почему так работал, но мой не сделал? –

+1

Проблема с вашим кодом была данными линии [i] = data [i-1]; он заменил значение null на следующее значение позиции, потому что вы уже увеличили индекс до следующей позиции. Таким образом, это будет похоже на данные [5] = данные [4] (null) –

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