удаление объекта из массива - PullRequest
0 голосов
/ 27 марта 2011

У меня есть массив объектов моего пользовательского класса, и я хочу удалить случайный объект (выбранный по некоторым критериям). Как мне это сделать и сохранить порядок в массиве? естественно, будет смещение элементов влево, но я не совсем удаляю элементную часть и мне нужна помощь в формулировании логики. это то, что я делаю, но это не работает правильно: (

     public static void deleteRecord(Customer[] records, int AccId){
      int pos=0; // index
      boolean  found = false;
      for (int i=0; i<count; i++){ // count is the number of elements in the array
          if (records[i].get_accountid()==AccId){
              found = true;
              pos = i;
               break;
          }
      }
      if (!found)
          System.out.println("The Record doesn't exist");

      for (int j=pos+1; j<count; j++) {
           records[j-1]= records[j];
          }

Ответы [ 3 ]

4 голосов
/ 27 марта 2011

Вы можете просто сдвинуть элементы влево, поскольку это перезапишет удаляемый элемент.

public void remove(Object[] a, int index) {
    for (int i = index + 1; i < a.length && a[i] != null; i++) {
        a[i - 1] = a[i];
    }
}

Предполагая, что первый null указывает на конец элементов.

Конечно, это время O (n), и существуют структуры данных, такие как LinkedList, которые могут удалять элементы за время O (1).

2 голосов
/ 27 марта 2011

К сожалению, вы не можете просто удалить элемент из массива, не оставив ни пустых индексов, ни создав новый массив.Я бы создал новый массив и использовал System.arraycopy , чтобы упростить копирование ваших элементов.Примерно так:

Object[] newArr = new Object[arr.length-1];
System.arraycopy(arr,0,newArr,0,index);
System.arraycopy(arr,index+1, newArr, index, newArr.length - index);
return newArr;

Где arr - ваш исходный массив, а index - случайный индекс для удаления.По сути, он копирует все элементы вплоть до индекса для удаления, а затем копирует все элементы после индекса.Вы можете обернуть это в отдельный метод для простоты.(Вместо того, чтобы использовать arraycopy, вы могли бы использовать два цикла for для выполнения одного и того же).

Я настоятельно рекомендую, поскольку другие должны использовать Список , который упрощает добавление и удалениеэлементы.

1 голос
/ 27 марта 2011

использовать коллекцию списка, например:

List<String> list = new ArrayList<String>();
int toDelete = getRandomIndex(lst.size()); //your own implementation 
if (toDelete >= 0) {
    list.remove(toDelete); // it'll remove and shift elements
}

документация о List.remove (int):

Удаляет элемент в указанной позиции в этом списке (необязательная операция).Смещает любые последующие элементы влево (вычитает один из их индексов).Возвращает элемент, который был удален из списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...