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 комментариев:
! Лучше использовать List !
Если ну очень хочется массив, могу предложить следующие улучшения:
1. использовать generics:
public static <T> T[] ...(final T[] array, T newItem)
2. второй метод: заменить ручное копирование на arraycopy
Да очень надо массив.
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;
}
Вот мой вариант:
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
Спасибо, все работает. Не мог найти то что нужно, пока не зашел сюда.
Отправить комментарий