Java - mandar elemento de un array al final

 
Vista:
Imágen de perfil de Carmen
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

mandar elemento de un array al final

Publicado por Carmen (10 intervenciones) el 25/07/2021 18:46:51
MUY BUENOS DIAS.
Estoy creando en java un metodo que me organice al final de un array todos los ceros que contenga. El código me falla cuando hay dos ceros seguidos. Algunas sugerencia?
De antemano agradezo la ayuda.
Feliz dia!
Presentacion1
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

mandar elemento de un array al final

Publicado por Kabuto (1381 intervenciones) el 26/07/2021 02:12:41
Interesante....

Aquí el problema es que encuentra un 0 en la posición [1]
Entonces inicia los intercambios para desplazarlo al final.
Pero claro, el primer intercambio lo hace con otro 0....

Entonces, al terminar los intercambios, se considera que la posición [1] ha quedado "corregida", pero resulta que ahí se ha quedado el 0 con el que se ha intercambiado la primera vez.


He pensado que quizás sea más óptimo comenzar el vector por el final y recorrerlo en orden invertido, hacia atrás.
Al encontrar un 0, iniciamos los intercambios, ahora sí hacia delante.

He escrito este código y parece funcionar.....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
        double[] vector = {1, 0, 0, 4};
 
	   for (int i = vector.length -1; i >= 0; i--) {
	       if (vector[i] == 0) {
	           for (int j = i + 1; j < vector.length; j++) {
	               if (vector[j] != 0) { //Solo intercambiamos si a continuación hay algo distinto de 0
	                    double temp = vector[i];
	                    vector[i] = vector[j];
	                    vector[j] = temp;
	               }
	           }
	       }
	   }
 
	    System.out.println(Arrays.toString(vector));
	 }


Sin embargo, no me convencía del todo y al probarlo con un vector más variado en posibilidades donde encontrar ceros, no termina de funcionar del todo bien.
Por ejemplo con este vector:
1
double[] vector = {0, 1, 0, 0, 4, 0, 0};

Da este resultado, que es incorrecto porque no desplaza todos los ceros, y además invierte el orden de 1 respecto al 4

1
[4.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]

Habrá que darle más vueltas al asunto, por desgracia ahora no tengo tiempo.

Otra cosa que se me ocurre es recorrer el vector de forma normal y extraer los valores a otros dos vectores temporales.
En uno se extraen los valores distintos de cero y en otro solo los ceros.
Luego, se crea un nuevo vector definitivo "fusionando" eso dos vectores temporales en uno solo, poniendo al principio los valores distintos de cero.

Pero parece una solución demasiado compleja con tanto vector, además previamente habría que contar cuantos ceros contiene el vector original para determinar que tamaños han de tener los vectores temporales, aunque está el truco de concatenar los valores en cadenas String que podemos hacer crecer sin especificar un tamaño fijo.

Pero tiene que haber alguna forma más ingeniosa y eficiente de ordenar trabajando directamente sobre el vector.
A ver si conseguimos dar con la solución.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Carmen
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

mandar elemento de un array al final

Publicado por Carmen (10 intervenciones) el 26/07/2021 02:39:00
Muy buenas noches, muchas gracias por tomarte el trabajo y el tiempo de responder.
claro, yo tengo claro que el problema se genera al hacer el intercambio con la posicion siguiente que tambien es un cero pero no he podido corregir esa parte, de una manera "limpia", es decir sin tanta vuelta y enrredo, no sé si me haga entender. Igual voy a explorar mas tu codigo depronto y por medio de él se pueda llegar a la solucion.
Gracias.
Feliz noche.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

mandar elemento de un array al final

Publicado por Costero (148 intervenciones) el 26/07/2021 03:46:43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Arrays;
 
public class OrderArray {
    public static void main(String[] args) {
 
//        double[] vector = {1, 0, 0, 4};
        double [] vector = {0, 1, 0, 0, 4, 0, 0};
 
 
        for (int i = 0; i < vector.length; ++i) {
 
            if (vector[i] == 0) {
 
                for (int j = i; j < vector.length; ++j) {
 
                    if (vector[j] != 0) {
 
                        double temp = vector[i];
 
                        vector[i] = vector[j];
 
                        vector[j] = temp;
 
                        break;
 
                    }
 
                }
 
            }
 
        }
 
        System.out.println(Arrays.toString(vector));
 
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carmen
Val: 6
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

mandar elemento de un array al final

Publicado por Carmen (10 intervenciones) el 26/07/2021 05:58:48
hola! buenas noches, super ! no le veo error jejeje! gracias, ya pude entender la logica...gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar