Удаление массива через обвёртывание в String[] и удаления его уже через asList выдает ошибку
Я знаю, что нельзя удалить данные из массива, но я попробовал int[] ar значения преобразовать в String[] arS. После я создал List list = new ArrayList(Arrays.asList(arS)), для того чтобы можно было использовать метод remove(), для удаления значений из массива String[] arS, но проблема в том, что в list, данные удалились, а в самих массивах arS и ar - нет. Не подскажите пожалуйста, что в такой ситуации делать? Буду очень благодарен.
public static void main(String[] args) {
int[] ar = {123, 234, 23, 4};
String[] arS = new String[ar.length];
for (int i = 0; i < ar.length; i++) {
arS[i] = Integer.toString(ar[i]);
}
List<String> list = new ArrayList<String>(Arrays.asList(arS));
for (int i = 0; i < ar.length; i++) {
list.remove(0);
}
System.out.println(list); // [], данные из массива удалились
System.out.println(Arrays.toString(arS)); // [123, 234, 23, 4], а здесь данные
//не удалились, хотя должны были, ведь это как, образно скажу, "Основной класс"
//(массив), а list, "дочерний класс" (массив).
//List<String> list = new ArrayList<String>(Arrays.asList(arS));
//list.remove(1);
//System.out.println(Arrays.toString(ar));
}
Ответы (2 шт):
Все правильно, вы удаляете значения только из листа, массив к нему отношения никакого не имеет. Фактически вы просто скопировали значения из массива в лист при создании листа. Если вы создали массив размером 4 элемента, он таким и останется (на 4 элемента). Для того чтобы получить массив с тремя элементами нужно либо создавать новый массив из 3 элементов, либо использовать динамический массив ArrayList
Пример кода с ArrayList ниже:
public class Test {
public static void main(String[] args) throws IOException {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.add(123);
list1.add(234);
list1.add(23);
list1.add(4);
System.out.println("Before remove:");
System.out.println("list1"+list1+ "size: " + list1.size());
System.out.println("list2"+list2+ "size:" + list2.size());
list2.add(list1.remove(0));
list2.add(list1.remove(0));
System.out.println("After remove:");
System.out.println("list1"+list1+ "size: " + list1.size());
System.out.println("list2"+list2+ "size:" + list2.size());
}
}
Выход
Before remove:
list1[123, 234, 23, 4]size: 4
list2[]size:0
After remove:
list1[23, 4]size: 2
list2[123, 234]size:2
Process finished with exit code 0
Не очень понимаю зачем Вам такие "танцы с бубном"? int[] -> String[] -> List -> remove element -> int[]? Выглядит как бредятина какая-то...
Почему бы просто не написать свою функцию удаления элемента из массива массива или не использовать готовую библиотеку Apache Common Lang 3 и в ней ArrayUtils.remove(), например?
Пример такой функции ::
public static int[] remove(int[] array, int index) {
final int length = array.length;
if (index < 0 || index >= length) {
throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
}
final int[] result = new int[length - 1];
System.arraycopy(array, 0, result, 0, index);
if (index < length - 1) {
System.arraycopy(array, index + 1, result, index, length - index - 1);
}
return result;
}
Использование ::
public static void main(String[] args) {
int[] array = {123, 234, 23, 4};
array = remove(array, 2);
System.out.println(Arrays.toString(array)); // [123, 234, 4]
}