Подтвердить что ты не робот

Добавить String в начало массива String

Можно ли добавить строку в начало массива String без итерации всего массива.

4b9b3361

Ответ 1

Единственный способ сделать это - поддерживать кольцевой буфер. то есть у вас есть счетчик, который запоминает, где находится старт, и вы перемещаете его, а не перемещаете все записи в массиве. Это работает только потому, что вы переопределяете то, что означает "начало".

Смотрите источник ArrayDeque, который имеет три поля

   86       /**
   87        * The array in which the elements of the deque are stored.
   88        * The capacity of the deque is the length of this array, which is
   89        * always a power of two. The array is never allowed to become
   90        * full, except transiently within an addX method where it is
   91        * resized (see doubleCapacity) immediately upon becoming full,
   92        * thus avoiding head and tail wrapping around to equal each
   93        * other.  We also guarantee that all array cells not holding
   94        * deque elements are always null.
   95        */
   96       private transient E[] elements;
   97   
   98       /**
   99        * The index of the element at the head of the deque (which is the
  100        * element that would be removed by remove() or pop()); or an
  101        * arbitrary number equal to tail if the deque is empty.
  102        */
  103       private transient int head;
  104   
  105       /**
  106        * The index at which the next element would be added to the tail
  107        * of the deque (via addLast(E), add(E), or push(E)).
  108        */
  109       private transient int tail;

Итак, добавление в начало работы похоже на

  224       public void addFirst(E e) {
  225           if (e == null)
  226               throw new NullPointerException();
  227           elements[head = (head - 1) & (elements.length - 1)] = e;
  228           if (head == tail)
  229               doubleCapacity();
  230       }


  312       /**
  313        * @throws NoSuchElementException {@inheritDoc}
  314        */
  315       public E getFirst() {
  316           E x = elements[head];
  317           if (x == null)
  318               throw new NoSuchElementException();
  319           return x;
  320       }

Примечание: он перемещает голову, а не перемещает все элементы вниз по массиву.

Ответ 2

попробовать

    String[] a = {"1", "2"};
    String[] a2 = new String[a.length + 1];
    a2[0] = "0";
    System.arraycopy(a, 0, a2, 1, a.length);

Ответ 3

Если вы уже используете Guava, вы можете использовать ObjectArrays::concat для этого:

String[] args = ...;
ObjectArrays.concat("prepended", args);

Ответ 4

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

Ответ 5

String[] myArray= {"hi","hi2"};
List<String> temp = new ArrayList<String>(Arrays.asList(prova));
temp.add(0, "h3");
myArray = temp.toArray(new String[temp.size()]);

Ответ 6

Это исправленная версия решения, предложенная @matteosilv:

String[] myArray= {"hi","hi2"};
List<String> list = new LinkedList<String>(Arrays.asList(myArray));
list.add(0, "h3");
myArray = list.toArray(new String[list.size()]);

Ответ 7

Чтобы сделать это, вы должны использовать List.

И если вы хотите особенно использовать внутренние массивы, перейдите к ArrayList

Ответ 8

Лучше всего я могу справиться...

public static void main(String[] args) {
        String[] s = new String[] { "a", "b", "c" };
        System.out.println(Arrays.toString(prepend(s,"d")));
}

public static String[] prepend(String[] a, String el) {
        String[] c = new String[a.length+1];
        c[0] = el;
        System.arraycopy(a, 0, c, 1, a.length);
        return c;
}

Ответ 9

Вы можете сделать что-то вроде ниже

public class Test {

public static String[] addFirst(String s[], String e) {
    String[] temp = new String[s.length + 1];
    temp[0] = e;
    System.arraycopy(s, 0, temp, 1, s.length);
    return temp;
}

public static void main(String[] args) {
    String[] s = { "b", "c" };
    s = addFirst(s, "a");
    System.out.println(Arrays.toString(s));
}
}