array is not data structure when you plan to remove an items, because to do so you have to create another array and copy all other items. Check this out:
static class Movie {
private final String id;
public Movie(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
public static Movie[] deleteMovieById(Movie[] movies, String id) {
int pos = findMovieById(movies, id);
if (pos == -1)
return movies; // not found; retrieve source array
Movie[] arr = new Movie[movies.length - 1];
System.arraycopy(movies, 0, arr, 0, pos);
System.arraycopy(movies, pos + 1, arr, pos, arr.length - pos);
return arr;
}
private static int findMovieById(Movie[] movies, String id) {
for (int i = 0; i < movies.length; i++)
if (movies[i].getId().equals(id))
return i;
return -1;
}
Output:
Movie[] movies = {
new Movie("1"),
new Movie("2"),
new Movie("3") };
Movie[] res = deleteMovieById(movies, "1");
Correct data structure to hold and to remove with constant time element is Map:
public static void deleteMovieById(Map<String, Movie> movies, String id) {
movies.remove(id);
}
Output:
Map<String, Movie> movies = Map.of(
"1", new Movie("1"),
"2", new Movie("2"),
"3", new Movie("3"));
deleteMovieById(movies, "1");
Can you see the difference?!
ArrayListfor this kind of stuff. With this, you won't have to deal with the troubles of deleting from an array, as this functionality is given to you for free when using these collections. Alternatives (like suggested) can be found here. As for your case, When you say n does not decrement, you probably have another issue going on.