2016-05-12 3 views
1

У меня есть следующие object[] array:Как вставить элемент между двумя другими в массиве

array[0] = obj_1; 
array[1] = obj_2; 
array[2] = obj_3; 
array[3] = NULL; 
array[4] = NULL; 

И мне нужно вставить еще один элемент между array[1] и array[2], как это:

array[0] = obj_1; 
array[1] = obj_2; 
array[2] = obj_New; 
array[3] = obj_3; 
array[4] = NULL; 

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

+0

Массивы представляют собой структуры с фиксированной длиной, которые не поддерживают динамическую вставку новых записей. Если вы хотите вставить между двумя элементами, лучше выбрать «Список». –

+0

@ S.Akbari Ну, вы не пытаетесь использовать 'List', но это проще. Списки используют массив внутри, поэтому _possible_. –

+0

@ S.Akbari, я знаю, что «Списки» имеют эти динамические вставки, но мне действительно нужно ** использовать массив –

ответ

5

Нет прямого пути. Сначала вам нужно перенести элементы, а затем установить значение по желаемому индексу.

Ниже приведен пример фрагмента (без каких-либо проверок индекса массива)

void InsertItem(object[] array, int index, object val) 
{ 
    for(int i=index;i<array.Length;i++) 
    { 
    array[i] = array[i-1]; 
    } 
    array[index] = val; 

} 

Обратите внимание, что массив после его создания выделяются contigigous местоположение, и имеют фиксированный размер. Они не могут быть произвольно перемещены.

Если вам требуются различные операции, я бы предложил linked list структуру данных.

+0

Движение буквально в ответ. Этот ответ, учитывая ваши ограничения на функциональность только для массивов, является точным. – gravity

+0

Этот код перезаписывает все значения с индексами, большими, чем 'index', со значением, найденным в' index - 1'. Например, вызов 'InsertItem (array, 1, 9)' on '{1, 2, 3, 4, 5}' возвращает '{1, 9, 1, 1, 1}'. – Quantic

0

От вашего сообщения это звучит так, будто вы хотите вытащить последний элемент из массива, а не первый.

Если так, как предположил Тилак, самый простой способ - взять/определить индекс, в который должен быть вставлен элемент, и переместить позиции из текущей позиции в следующую последующую позицию и, наконец, добавить новый элемент в заданный индекс. Вы хотели бы следить за тем, что произойдет, если массив уже заполнен, вы хотите удалить последний элемент или нет?

Мы можем немного оптимизировать код Тилака, не переписывая элемент массива [index] дважды, один раз в цикле и один раз снаружи.

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

 

    void InsertItem(object[] array, int index, object val) 
    { 
     for(int i=array.Length - 1; i > index; i--) 
     { 
     array[i] = array[i-1]; 
     } 

     array[index] = val; 
    } 

Как и многие другие, список или LinkedList будет лучшим выбором.

1

Мне просто нужен был свет, чтобы сделать это. Я использовал пример Тилака как мою базу, и я сделал следующий код (С еще несколько вещей, как добавить в конце списка и с начальным пустым массивом):

object[] array = new object[0]; 
public void Insert(int index, object val) 
    { 
     Array.Resize(ref array, array.Length + 1); 

     if (index >= array.Length-1) 
     { 
      array[array.Length - 1] = val; 
      return; 
     } 

     for (int i = 0; i < array.Length; i++) 
     { 
      if (index == i) 
      { 
       for (int idx = array.Length; idx > index; idx--) 
       { 
        array[idx-1] = array[idx-2]; 
       } 
       array[i] = val; 
       return; 
      } 
     } 
    } 

Это полностью функциональное и Array.Resize активирует каждый время, в которое я вставляю что-то, чтобы в моем массиве всегда было ровно столько слотов, которые мне нужны.

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