Ordenar una lista de números enteros sobre la base de una lista de cadenas en Java

5377037:

Tengo un conjunto de datos o menos así:

85 [Italy, France]    
95 [Italy]
91 [Israel, Jordan]
85 [France, Italy, Switzerland]
80 [USA]
84 [Mongolia, China]
95 [Antarctica]
84 [African Union]
82 [Argentina]
95 [Tibet, Nepal]
...

Que he ordenados en base a la base de los números enteros mediante el siguiente código (que define el modelo de clase):

public class Wonder implements Comparable<Wonder> {
    int hostility;
    List<String> countries;
    //some other data members

    //constructor
    //getters

    @Override
    public int compareTo(Wonder other) {
        if(hostility == other.hostility) {
            return 0;
        } else if(hostility < other.hostility) {
            return -1;
        } else if(hostility > other.hostility) {
            return 1;
        } else {
            return 0;
        }
    }
}

Código de clasificación (PS: getAllDatamétodo devolverá una lista de maravillas, la carga del archivo de texto ):

List<Wonder> wonders = getAllData(filePath);
wonders.sort((c1,c2)->c1.compareTo(c2));
Collections.reverse(wonders); // ordering highest to lowest 

Después de la clasificación del conjunto de datos (ordenados en base a números enteros) es como la siguiente:

95 [Antarctica]
95 [Italy]
95 [Tibet, Nepal]
91 [Israel, Jordan]
85 [France, Italy, Switzerland]
85 [Italy, France]
84 [Mongolia, China]
84 [African Union]
82 [Argentina]
80 [USA]
...

Ahora , no hay necesidad de ordenar nuevamente generada conjunto de datos alfabéticamente que son la lista de países (cadenas). Por ejemplo, en el nuevo conjunto de datos hay dos registros con el mismo número entero 84 (primera entero tiene país Mongolia y segundo número entero tiene país de la Unión Africana), por lo que el segundo registro debe venir por primera vez como la Unión Africana es alfabéticamente antes de la Mongolia.

...
84 [African Union]
84 [Mongolia, China]
...

Pregunta: ¿Cómo ordenar una lista de números enteros sobre la base de una lista de cadenas?

AVI:

Puede especializarse aún más la función compareTo de promulgar una comparación secundaria. Estoy asumiendo que cada lista contiene al menos un país; Si tal no es el caso, debe manejar listas vacías. El compareTo alterado es como tan:

@Override
public int compareTo(Wonder other) {
    if(this == other) {
        return 0;
    } else if(hostility < other.hostility) {
        return -1;
    } else if(hostility > other.hostility) {
        return 1;
    } else {
        return -countries.get(0).compareTo(other.countries.get(0));
    }
}

Alternativamente, usted puede estar buscando esto:

wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed()
    .thenComparing(wonder -> wonder.getCountries().get(0)));
//don't reverse afterwards!

de acuerdo con el estilo de Andrew @

Un repl.it con la mejor de todas las respuestas

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=278805&siteId=1
Recomendado
Clasificación