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?
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:
“`java lines = new ArrayList ();
File inputFile = new File (“input.txt”) ;
BufferedReader reader = new BufferedReader (nuevo FileReader (inputFile));
List
String line;
while ((line = reader.readLine()) != null) {
lines.add(line) ;
}
“ `
“`java customComparator = new Comparator () {
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;
}
};
“ `
“`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.