es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar por la primera columna, después por la segunda si la primera contiene duplicados, etc.

Tengo un archivo .txt simple que contiene una tabla donde las columnas están divididas por tabulación. Por lo tanto, necesito leer los datos del archivo y escribirlos en otro de manera clasificada. Primero, necesito ordenar por la primera columna. Si contiene valores duplicados, los valores de la segunda columna deberán ordenarse (solo los que están en contra de los duplicados de la primera columna) y así sucesivamente.
Los números son más altos que las letras, los números están en orden ascendente, las letras están en orden alfabético.
Entonces, si tengo un archivo como este:

Después de la ordenación necesito tener este:

Encontré el siguiente enlace: https://stackoverflow.com/questions/740936/how-do-i-sort-records-in-a-text-file-using-java, pero ¿hay alguna manera efectiva de implementar la lógica de ordenación restante, no solo por la primera columna?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una manera efectiva de implementar la lógica de clasificación restante en Java. Puede lograr esto creando un comparador personalizado que tenga en cuenta las diferentes condiciones para ordenar los datos.

    Aquí hay un ejemplo de cómo puede implementar esto:

    1. Primero, necesita leer los datos del archivo de texto de entrada y almacenarlos en un array o una lista. Puede hacer esto utilizando un BufferedReader y un FileReader:

     “`java
    File inputFile = new File (“input.txt”) ;
    BufferedReader reader = new BufferedReader (nuevo FileReader (inputFile));
    List lines = new ArrayList();

    String line;
    while ((line = reader.readLine()) != null) {
        lines.add(line) ;
    }
    “ `

    1. A continuación, puede crear un comparador personalizado que compare cada línea basándose en los criterios de clasificación. El comparador debe comparar las líneas en función de los valores en la primera columna, luego la segunda columna (si hay duplicados en la primera columna), etc.

     “`java
    Comparator customComparator = new Comparator() {
        public int compare(String line1, String line2) {
            String[] values1 = line1.split(“\ t”);
            String[] values2 = line2.split(“\ t”);

            // Compare la primera columna
            int result = 0;
            if (Character.isDigit(values1[0].charAt(0)) && Character.isDigit(values2[0].charAt(0))) {
                int num1 = Integer.parseInt(values1[0]);
                int num2 = Integer.parseInt(values2[0]);
                result = Integer.compare(num1, num2);
            } más {
                result = values1[0].compareTo(values2[0]);
            }

            // Compare la segunda columna (si los valores de la primera columna son iguales)
            if (resultado == 0 && valores1.longitud> 1 && valores2.longitud> 1) {
                if (Character.isDigit(values1[1].charAt(0)) && Character.isDigit(values2[1].charAt(0))) {
                    int num1 = Integer.parseInt(values1[1]);
                    int num2 = Integer.parseInt(values2[1]);
                    result = Integer.compare(num1, num2);
                } más {
                    result = values1[1].compareTo(values2[1]);
                }
            }

            // Compare la tercera columna (si los valores de la primera y segunda columna son iguales)
            if (resultado == 0 && valores1.longitud> 2 && valores2.longitud> 2) {
                if (Character.isDigit(values1[2].charAt(0)) && Character.isDigit(values2[2].charAt(0))) {
                    int num1 = Integer.parseInt(values1[2]);
                    int num2 = Integer.parseInt(values2[2]);
                    result = Integer.compare(num1, num2);
                } más {
                    result = values1[2].compareTo(values2[2]);
                }
            }

            retorno resultado;
        }
    };
    “ `

    1. Finalmente, puede ordenar las líneas utilizando el comparador personalizado y escribirlas en el archivo de salida:

     “`java
    Collections.sort(lines, customComparator);

    File outputFile = new File (“output.txt”) ;
    BufferedWriter writer = new BufferedWriter (nuevo FileWriter (outputFile));

    for (String line: lines) {
        writer.write(line);
        writer.newLine () ;
    }

    writer.close();
    “ `

    Con esta implementación, puede ordenar los datos en el archivo de entrada basándose en múltiples criterios, como se describe en la pregunta original.

Comments are closed.