#java #arrays #for-loop
Вопрос:
public static void remove (int[] arr, int toRemove)
«Это должно удалить значение ToRemove из массива. Остальные элементы должны быть просто сдвинуты в сторону начала массива. (Размер массива не изменится). Поскольку теперь в массиве будет использоваться на один элемент меньше, исходный последний элемент следует просто заменить на 0. Если в массиве имеется более одного вхождения ToRemove, следует удалить только ПЕРВОЕ вхождение. Если в массиве нет элементов, это просто не должно иметь никакого эффекта».
До сих пор у меня есть это:
public static void remove(int[] arr, int toRemove) {
for(int i = 0; i <= arr.length - 1; i ) {
if(arr[i] == toRemove) {
arr[i] = arr[i 1];
arr[toRemove] = 0;
}
}
}
У меня есть основной метод с массивом с его содержимым: [3, 5, 7, 8, 12, 2]
и сообщением о вызове remove(array, 5)
. Однако мой массив распечатывается [3, 7, 7, 8, 12, 0]
, когда он должен быть распечатан [3, 7, 8, 12, 2, 0]
.
Может ли кто-нибудь сообщить мне, в чем я ошибся, и объяснить это?
Комментарии:
1. Таким образом, ваш код обнаруживает, что arr[1] равен 5, устанавливает его в arr[2], что равно 7, а затем по какой-то причине вы устанавливаете arr[5] равным нулю. Вы не сдвигаете ни один из других элементов.
2. Две вещи — вы заменяете индекс любого
toRemove
элемента на 0, вместо фактического последнего элемента, поэтому в вашем случае вы удаляетеarr[5]
(что в данном случае случайно оказывается последним элементом), и вы не учитываете несколько вхожденийtoRemove
.3. Пошаговое выполнение кода с помощью отладчика
4. @ManishGiri Я должен удалить только первое вхождение, а затем программа завершится. И поскольку это цикл, не означает ли это, что он установит все текущие индексы на следующие индексы (i 1), сдвинутые влево? Я полагаю, что я все еще не понимаю, как переместить все остальные элементы.
5. Что делать, если у вас во много раз больше значения
toRemove
в массиве?
Ответ №1:
Вот подход, аналогичный тому, что я описал в комментариях выше.
import java.util.Arrays;
public class main
{
// tip: arguments are passed via the field below this editor
public static void main(String[] args)
{
int[] arr = {3, 5, 7, 8, 5, 12, 2};
remove(arr, 5);
System.out.println(Arrays.toString(arr)); // [3, 7, 8, 5, 12, 2, 0]
}
public static void remove(int[] arr, int toRemove) {
int idx = -1;
// determine first occurrence of toRemove
for(int i = 0; i < arr.length; i ) {
if(arr[i] == toRemove) {
idx = i;
break;
}
}
// if not found, return
if(idx == -1) return;
// shift other elements down
for(int i = idx; i < arr.length-1; i ) {
arr[i] = arr[i 1];
}
// set last element to 0
arr[arr.length-1] = 0;
}
}
Комментарии:
1. могли бы мы пообщаться? Я знаю, что не имею права спрашивать, но я действительно хочу быть хорошим программистом, но есть некоторые вещи, которые мне трудно понять. Мне нужно, чтобы мне элементарно объяснили понятия. У меня есть проект по кодированию, в котором мне нужна помощь, если вы готовы помочь коллеге-ученику. Моя электронная почта: nguyen_david1949@yahoo.com. Спасибо вам даже за то, что вы прочитали!
2. @Манаш Гири, я только что написал вам по электронной почте, сэр.
Ответ №2:
Вам нужно иметь два индекса:
fromIndex-это тот, который входит в массив.
toIndex-это место, где должен находиться предмет.
public static void remove(int[] arr, int toRemove) {
int toIndex = 0;
for(int fromIndex = 0; fromIndex < arr.length; fromIndex ) {
//paste number only if its not 'toRemove'
if(arr[fromIndex] != toRemove) {
arr[toIndex] = arr[fromIndex];
toIndex ;
}
}
//Fill the rest with 0
for (; toIndex < arr.length; toIndex )
arr[toIndex] = 0;
}
это работает, если существует несколько индексов со значением ToRemove
Ответ №3:
Вы должны использовать System.arraycopy
. Это быстро. Попробуй это.
public static void remove(int[] arr, int toRemove) {
for(int i = 0, length = arr.length; i < length; i ) {
if(arr[i] == toRemove) {
System.arraycopy(arr, i 1, arr, i, length - i - 1);
arr[length - 1] = 0;
break;
}
}
}
public static void main(String[] args) throws IOException {
int[] a0 = {0, 1, 2, 3, 4};
remove(a0, 0);
System.out.println(Arrays.toString(a0));
int[] a4 = {0, 1, 2, 3, 4};
remove(a4, 4);
System.out.println(Arrays.toString(a4));
int[] a5 = {0, 1, 2, 3, 4};
remove(a5, 5);
System.out.println(Arrays.toString(a5));
int[] a6 = {0};
remove(a6, 0);
System.out.println(Arrays.toString(a6));
int[] a7 = {};
remove(a7, 0);
System.out.println(Arrays.toString(a7));
}
выход:
[1, 2, 3, 4, 0]
[0, 1, 2, 3, 0]
[0, 1, 2, 3, 4]
[0]
[]