Java - Obtener índices de un vector

 
Vista:
sin imagen de perfil

Obtener índices de un vector

Publicado por Xavi (14 intervenciones) el 03/10/2021 12:02:47
Hola,

Soy nuevo en Java y estoy intentando hacer lo siguiente. Tengo un vector que se pasa como parámetro de entrada y quiero ordenarlo de mayor a menor y después mostrar por pantalla el vector ordenado junto con la posición que ocupaba el número en cuestión en el vector original. Por ejemplo, si se le pasa el vector:
1
{4.2, 8.1, 9.4, 6.1, 4.7, 6.4, 6.0, 7.7}
, la salida debería ser:

1
2
3
4
5
6
7
8
"9.4 (2)"
"8.1 (1)"
"7.7 (7)"
"6.4 (5)"
"6.1 (3)"
"6.0 (6)"
"4.7 (4)"
"4.2 (0)"

Por el momento he hecho lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void sortAverageGradesAndShowIndices(double[] averageNotes) {
 
 
 double aux;
 
        for (int i=0; i < averageNotes.length -1; i++){
            for (int j=0; j < averageNotes.length -1; j++){
                // Si el numero actual es mayor al siguiente
                if(averageNotes[j] > averageNotes[j+1]){
                    // Intercambiamos numeros
                    aux = averageNotes[j];
                    averageNotes[j] = averageNotes[j+1];
                    averageNotes[j+1]=aux;
 
                }
            }
        }
        // Orddenamos de mayor a menor
        for (int i=(averageNotes.length-1); i>=0;i--){
            System.out.println(String.format("%.1f (%d)",averageNotes[i],i));
        }
    }

La salida de este trozo de código es:

1
2
3
4
5
6
7
8
9,4 (7)
8,1 (6)
7,7 (5)
6,4 (4)
6,1 (3)
6,0 (2)
4,7 (1)
4,2 (0)

Como podéis ver no estoy asignando correctamente la posición que ocupaba el número en el vector original. De hecho, estoy mostrando la posición que ocupa cada número en el vector ya ordenado. Para dar con lo que quiero, había pensado en crear un nuevo vector y buscar la posición en el vector original pero no tengo claro como hacerlo. Me podríais echar una mano?

Por si ayuda, estoy usando el siguiente tipo de test para pasar la validación:

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
38
39
@Test
    @Order(4)
    void testSortAverageNotesAndShowIndices() {
 
        ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream();
        System.setOut(new PrintStream(outputStreamCaptor));
        PAC1Ex3.sortAverageGradesAndShowIndices(new double[] {4.2, 8.1, 9.4, 6.1, 4.7, 6.4, 6.0, 7.7});
        assertEquals("9.4 (2)"+System.lineSeparator()
                + "8.1 (1)"+System.lineSeparator()
                + "7.7 (7)"+System.lineSeparator()
                + "6.4 (5)"+System.lineSeparator()
                + "6.1 (3)"+System.lineSeparator()
                + "6.0 (6)"+System.lineSeparator()
                + "4.7 (4)"+System.lineSeparator()
                + "4.2 (0)", outputStreamCaptor.toString().trim());
 
        outputStreamCaptor = new ByteArrayOutputStream();
        System.setOut(new PrintStream(outputStreamCaptor));
        PAC1Ex3.sortAverageGradesAndShowIndices(new double[] {6.6, 7.9, 8.9, 9.6, 7.3, 6.5, 4.0});
        assertEquals("9.6 (3)"+System.lineSeparator()
                + "8.9 (2)"+System.lineSeparator()
                + "7.9 (1)"+System.lineSeparator()
                + "7.3 (4)"+System.lineSeparator()
                + "6.6 (0)"+System.lineSeparator()
                + "6.5 (5)"+System.lineSeparator()
                + "4.0 (6)", outputStreamCaptor.toString().trim());
 
 
        outputStreamCaptor = new ByteArrayOutputStream();
        System.setOut(new PrintStream(outputStreamCaptor));
        PAC1Ex3.sortAverageGradesAndShowIndices(new double[] {7.0, 7.5, 8.0, 8.5, 9.0});
        assertEquals("9.0 (4)"+System.lineSeparator()
                + "8.5 (3)"+System.lineSeparator()
                + "8.0 (2)"+System.lineSeparator()
                + "7.5 (1)"+System.lineSeparator()
                + "7.0 (0)", outputStreamCaptor.toString().trim());
 
 
    }



Gracias!
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

Obtener índices de un vector

Publicado por Kabuto (1082 intervenciones) el 03/10/2021 17:56:16
Hola.

La única solución que se me ocurre es la que tu mismo propones, crear un segundo vector con los índices. Estos índices irán cambiando de posición al mismo tiempo que cambiamos los valores al ordenarlos.

Por cierto, no se por qué ordenas de menor a mayor y luego haces un recorrido inverso para mostrarlos de mayor a menor.
Parece más lógico ordenar directamente de mayor a menor.

Te dejo un ejemplo rápido:
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
38
39
40
41
42
43
44
public class Ordenar {
 
	public static void main(String[] args) {
 
		double[] valores = {4.2, 8.1, 9.4, 6.1, 4.7, 6.4, 6.0, 7.7};
 
		ordenarConIndices(valores);
	}
 
	private static void ordenarConIndices(double[] vector) {
		//Creamos array complementario para los indices
		int[] indices = new int[vector.length];
		for (int i = 0; i < indices.length; i++)
			indices[i] = i;
 
		/*
		 * Ahora, al mismo tiempo que cambiamos el orden
		 * de los valores del vector, cambiaremos también los
		 * indices correspondientes.
		 */
		double auxValor;
		int auxIndice;
		//Ordenamos de mayor a menor
		for (int i=0; i < vector.length -1; i++){
			for (int j=0; j < vector.length -1; j++){
				if(vector[j] < vector[j+1]){
					//Intercambiamos valores
					auxValor = vector[j];
					vector[j] = vector[j+1];
					vector[j+1]=auxValor;
					//Y también los indices
					auxIndice = indices[j];
					indices[j] = indices[j+1];
					indices[j+1] = auxIndice;
				}
			}
		}
		// Salida
		for (int i = 0; i < vector.length; i++){
			System.out.println(String.format("%.1f (%d)",vector[i],indices[i]));
		}
	}
 
}
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
sin imagen de perfil

Obtener índices de un vector

Publicado por Xavi (14 intervenciones) el 03/10/2021 18:33:01
Muchísimas 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

Obtener índices de un vector

Publicado por Tom (1765 intervenciones) el 06/11/2021 20:42:38
Sólo porque es divertido, probablemente sea más lento que vuestros for.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Sort {
	static record Pair(double v, int i) {};
        /* */
	public static void ordenarConIndices(double a[]) {
		IntStream.range(0, a.length).mapToObj(i -> new Pair(a[i], i))
				.sorted((Pair left, Pair right) -> Double.compare(left.v, right.v))
				.forEach((p) -> System.out.printf("%f\t(%d)\n", p.v, p.i));
		System.out.println("--");
	}
	/* */
	public static void main(String[] args) {
		double[] valores = {4.2, 8.1, 9.4, 6.1, 4.7, 6.4, 6.0, 7.7};
 
		ordenarConIndices(valores);
	}
}
run:
4.200000 (0)
4.700000 (4)
6.000000 (6)
6.100000 (3)
6.400000 (5)
7.700000 (7)
8.100000 (1)
9.400000 (2)
--
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