Hello! I am currently engaged in the book "Data Structures and Algorithms in Java" by Robert Lafore. There is an example for removing an element from an array by a given value. (p.54)

It looks like this:

public class ArrayApp { public static void main(String[] args) { long[] arr; //ссылка Π½Π° массив arr = new long[100]; //созданиС массива int nElems = 0; //количСство элСмСнтов int j; //счСтчик Ρ†ΠΈΠΊΠ»Π° long searchKey; //ΠΊΠ»ΡŽΡ‡ΠΈ искомого элСмСнта // вставка 10 элСмСнтов arr[0] = 77; arr[1] = 99; arr[2] = 44; arr[3] = 55; arr[4] = 22; arr[5] = 88; arr[6] = 11; arr[7] = 00; arr[8] = 66; arr[9] = 33; nElems = 10; //массив содСрТит 10 элСмСнтов // Π²Ρ‹Π²ΠΎΠ΄ элСмСнтов for (j = 0; j < nElems; j++) System.out.print(arr[j] + " "); System.out.println(""); searchKey = 55; //ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 55 for (j = 55; j < nElems; j++) //поиск удаляСмого элСмСнта if (arr[j] == searchKey) break; for (int k = j; k < nElems - 1; k++) //сдвиг ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов arr[k] = arr[k + 1]; nElems--; //ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° for (j = 0; j < nElems; j++) //Π²Ρ‹Π²ΠΎΠ΄ элСмСнтов System.out.print(arr[j] + " "); System.out.println(""); } } 

Ideally, the answer should be:

77 99 44 55 22 88 11 0 66 33

77 99 44 22 88 11 0 66 33

In fact, the program now works like this:

77 99 44 55 22 88 11 0 66 33

77 99 44 55 22 88 11 0 66

That is, it simply deletes the last element of the array instead of the specified value.

How should it be to write a cycle so that it works correctly?

  • And if you need to throw out several identical elements - Peter Dmitrenko

2 answers 2

Added / modified characters are marked with two asterisks. Work code

 public class ArrayApp { public static void main(String[] args) { long[] arr; //ссылка Π½Π° массив arr = new long[100]; //созданиС массива int nElems = 0; //количСство элСмСнтов int j; //счСтчик Ρ†ΠΈΠΊΠ»Π° long searchKey; //ΠΊΠ»ΡŽΡ‡ΠΈ искомого элСмСнта // вставка 10 элСмСнтов arr[0] = 77; arr[1] = 99; arr[2] = 44; arr[3] = 55; arr[4] = 22; arr[5] = 88; arr[6] = 11; arr[7] = 00; arr[8] = 66; arr[9] = 33; nElems = 10; //массив содСрТит 10 элСмСнтов // Π²Ρ‹Π²ΠΎΠ΄ элСмСнтов for (j = 0; j < nElems; j++) System.out.print(arr[j] + " "); System.out.println(""); searchKey = 55; //ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 55 for (j = **0**; j < nElems; j++) **{** //поиск удаляСмого элСмСнта if (arr[j] == searchKey) break; **}** for (int k = j; k < nElems - 1; k++) //сдвиг ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов arr[k] = arr[k + 1]; nElems--; //ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° for (j = 0; j < nElems; j++) //Π²Ρ‹Π²ΠΎΠ΄ элСмСнтов System.out.print(arr[j] + " "); System.out.println(""); } 
  • Yes, I understand now. thanks, Sergey :) - Paranoid Android

Once I also met such a problem, I decided it so.

  // The method removes a element[index]. public void remove (int index) { if (index == 0) { int[] array2 = new int[array.length-1]; System.arraycopy(array, 1, array2, 0, array2.length); array = array2; } else if (index == array.length-1) { int[] array2 = new int[array.length-1]; for (int i = 0; i < array.length-1; i++) { array2[i] = array[i]; } array = array2; } else { int[] array2 = new int[array.length-1]; for (int i = 0; i < array.length; i++) { if (i > index) { array2[i-1] = array[i]; } if (i == index) { continue; } if (i < index) { array2[i] = array[i]; } } array = array2; } }