Hay muchas respuestas aquí - el problema que veo es que no dijiste POR QUÉ estás usando una matriz en lugar de una colección, así que déjame sugerirte un par de razones y qué soluciones aplicarían (la mayoría de las soluciones ya han sido respondidas en otras preguntas aquí, así que no entraré en demasiado detalle) :
razón: Usted no sabe el paquete de colección existía o no confiaba en que
solución: Utilice una colección.
Si planea agregar/eliminar desde el medio, use una ListaEnlazada. Si está realmente preocupado por el tamaño o, a menudo, indexa justo en el medio de la colección, use una ArrayList. Ambos deberían tener operaciones de eliminación.
razón: Usted está preocupado por tamaño o quiere control sobre la asignación de memoria
solución: Utilice un ArrayList con un tamaño inicial específica.
Una ArrayList es simplemente una matriz que puede expandirse, pero no siempre tiene que hacerlo. Será muy inteligente agregar/eliminar elementos, pero nuevamente si está insertando/eliminando un LOTE desde el medio, use una Lista Vinculada.
razón: tiene una matriz que entra y una matriz de salir - por lo que desea operar en una serie
solución: Convertir a un ArrayList, elimine el elemento y convertirlo de nuevo
razón: usted piensa que puede escribir mejor código si lo hace usted mismo la solución
: no se puede, utilizar una matriz o lista enlazada.
razón: se trata de una tarea de clase y no se le permite o no tener acceso a las API de recolección por alguna razón
hipótesis: Es necesario la nueva matriz que es el "tamaño" correcto
solución: Escanee el conjunto de elementos coincidentes y cuéntelos. Cree una nueva matriz del tamaño correcto (tamaño original - número de coincidencias). use System.arraycopy varias veces para copiar cada grupo de elementos que desea conservar en su nueva matriz. Si se trata de una asignación de clase y no puede usar System.arraycopy, simplemente cópielos uno por uno a mano en un bucle, pero nunca haga esto en el código de producción porque es mucho más lento. (Estas soluciones son detalladas en otras respuestas)
razón: es necesario ejecutar el metal desnudo
hipótesis: No debe asignar espacio innecesariamente o tomar demasiado tiempo suposición
: Se realiza el seguimiento de la tamaño utilizado en la matriz (longitud) por separado porque de lo contrario tendrías que reasignar tu matriz para eliminar/insertar.
Un ejemplo de por qué es posible que desee hacer esto: una única matriz de primitivas (digamos valores int) está tomando una porción significativa de su ram, ¡como el 50%! Un ArrayList forzaría estos en una lista de punteros a objetos enteros que usarían algunas veces esa cantidad de memoria.
solución: itere sobre su matriz y siempre que encuentre un elemento para eliminar (llamémosle elemento n), use System.arraycopy para copiar la cola de la matriz sobre el elemento "eliminado" (Fuente y destino son la misma matriz) - es lo suficientemente inteligente como para hacer la copia en la dirección correcta para que la memoria no sobrescribe sí:
System.arraycopy(ary, n+1, ary, n, length-n)
length--;
es probable que quiera ser más inteligente que esto si va a eliminar más de un elemento en un momento. Solo movería el área entre una "coincidencia" y la siguiente en lugar de toda la cola y, como siempre, evite mover cualquier trozo dos veces.
En este último caso, absolutamente debe hacer el trabajo usted mismo y usar el Sistema.arraycopy es realmente la única manera de hacerlo, ya que va a elegir la mejor manera posible de mover la memoria para la arquitectura de su computadora; debe ser mucho más rápido que cualquier código que pueda escribir usted mismo razonablemente.
No se puede cambiar el tamaño de una matriz en Java. Supongo que no quieres simplemente anular los elementos ya que eso sería trivial. ¿Desea cambiar los otros elementos para eliminar los huecos? –
Es trivial, ahora que sé que puedo hacerlo. ;) ¡Gracias! – ramayac