12 ноября 2008

Добавление элементов в Java масив

Написал 2 простые функции по добавлению одного или нескольких элементов в конец масива.

public static String[] addToArray(String[] array, String s) {
String[] ans = new String[array.length+1];
System.arraycopy(array, 0, ans, 0, array.length);
ans[ans.length - 1] = s;
return ans;
}

public static String[] addToArray(String[] array, String[] s) {
String[] ans = new String[array.length + s.length];
System.arraycopy(array, 0, ans, 0, array.length);
System.arraycopy(s, 0, ans, array.length, s.length);
return ans;
}

У кого есть более эффективный метод прошу поделиться.

7 комментариев:

Andrey Rybin комментирует...

! Лучше использовать List !

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

1. использовать generics:
public static <T> T[] ...(final T[] array, T newItem)

2. второй метод: заменить ручное копирование на arraycopy

Rumoku комментирует...

Да очень надо массив.
2 учёл, а вот 1 немного не подходит.

Анонимный комментирует...

Спасибо, пригодилось. А что на счет удаления? Есть что готовое? Я вот быстренько написал, но за красоту решения не ручаюсь. Работает при условии, что удаляемый элемент есть в массиве и он один, если больше, то в выходном массиве на месте последних элементов будет null :)


private static String[] deleteFromArray(String[] array, String s){
String[] ans = new String[array.length-1];
int t = 0;
for (int i=0; i < array.length; i++){
if (array[i].equals(s)) {
t++;
continue;
}
ans[i-t]=array[i];
}
return ans;
}

Анонимный комментирует...

Вот еще один вариант

public static String[] deleteFromArray(String[] array, String s) {
String[] ans = new String[array.length - 1];
int i = 0;
int j = 0;
while (i < array.length && j < ans.length) {
if (array[i].equals(s)) {
i++;
} else {
ans[j] = array[i];
i++;
j++;
}
}
return ans;
}

Rumoku комментирует...

Вот мой вариант:
public static String[] deleteElelentFromArray(String[] arr , String el){
String[] res = new String[arr.length - 1];
int pos = -1 ;
//Arrays.binarySearch(arr, el);
for (int i = 0 ; i < arr.length; i++) {
if (arr[i].equals(el)) {
pos = i;
break;
}
}
if (pos>0) {
System.arraycopy(arr, 0, res, 0, pos );
System.arraycopy(arr, pos + 1, res, pos, res.length - pos );
return res;
} else {
return arr;
}

}

Анонимный комментирует...

Сейчас ради интереса попробовал быстродействие всех трех функции на массиве из 500000 элементов. Первый и третий способ опережают второй по скорости в два раза :)

Время в милисекундах
process time1 = 16
process time2 = 31
process time3 = 16

Николай Дубков комментирует...

Спасибо, все работает. Не мог найти то что нужно, пока не зашел сюда.