2015-07-23 4 views
3

У меня есть входной массив [3, 5, 12, 8], и я хочу, чтобы выходной массив (вход не должен быть affeccted) идентичен входу, но с элементом 7, вставленным между 5 и 12, поэтому при индексе 2 входного массива.Как написать общий метод для вставки элемента в массив?

Вот что у меня есть. Я закомментировать код, который не компилируется событие, и добавил пару вопросов, которые возникли при попытке так или иначе:

public static <O>ArrayList<O> addToSet(O[] in,O add,int newIndex){ 
// O obj = (O) new Object(); //this doesnt work 
// ParameterizedType obj = (ParameterizedType) getClass().getGenericSuperClass(); // this is not even recognized 
    ArrayList<O> out = multipleOfSameSet(obj, in.length); 
    if (newIndex > in.length){ 
     out = new ArrayList<>(newIndex+1); // also noticed that initializing an ArrayList 
     //like this throws an IndexOutOfBoundsException when i try to run out.get(), 
     // could someone explain why?? 
     out.set(newIndex, add); 
    } 
    int j = 0; 
    int i = 0; 
    while(j<in.length+1){ 
     if (j==newIndex){ 
      out.set(j, add); 
     } else if(i<in.length){ 
      out.set(j, in[i]); 
      i++; 
     } 
     j++; 
    } 
    return out; 
} 

Тип компонента массива может быть String, Integer или даже JPanel.

+2

Вы не можете этого сделать. – SLaks

+0

@SLaks ничего не может сделать? инициализировать obj внутри моего метода? – kbluue

+0

Что это должно было сделать? – Raffaele

ответ

1

Вот общий вариант кода

@SuppressWarnings("unchecked") 
public <T> T[] insertInCopy(T[] src, T obj, int i) throws Exception { 
    T[] dst = (T[]) Array.newInstance(src.getClass().getComponentType(), src.length + 1); 
    System.arraycopy(src, 0, dst, 0, i); 
    dst[i] = obj; 
    System.arraycopy(src, i, dst, i + 1, src.length - i); 
    return dst; 
} 

но вы можете специализироваться метод для работы с примитивными типами. Я имею в виду, что дженерики и массивы не очень хорошо сочетаются - так что у вас будут проблемы с int и вам нужно будет использовать типы оберток:

@Test 
public void testInsertInTheMiddle() throws Exception { 
    Integer[] in = {3, 5, 12, 8}; 
    Integer[] out = target.insertInCopy(in, 7, 2); 
    assertEquals(out, new Integer[] {3, 5, 7, 12, 8}); 
} 
+0

Я понимаю. Я даже не знал о аррацикопии. Это будет очень полезно. Об использовании типов-оболочек (Integer вместо int, right), я думаю, что литье должно позаботиться об этой проблеме. Большое вам спасибо. – kbluue

+0

Я имею в виду, может быть, вы обнаружите, что дело с обертками утомительно. Если это код библиотеки, рассмотрите аналогичные методы, по крайней мере, для int и double. Кроме того, если он решает вашу проблему, пожалуйста, поддержите и примите этот ответ – Raffaele

0

Вы можете сделать это.

static <T> void fromArrayToCollection(T[] a, Collection<T> c) { 
    for (T o : a) { 
     c.add(o); 
    } 
} 
Смежные вопросы