¿Cómo puedo ordenar dos ArrayLists y ponerlos en un mapa?

Núcleo del corazón :

Mi programa calcula las sumas de dígitos de todos los valores introducidos en un archivo de texto. Los valores introducidos y sus sumas dígitos según se almacenan en dos ArrayLists separadas.

Ambos ArrayLists se combinan en un LinkedHashMap en el extremo que debe ser ordenado por la suma de dígitos en orden descendente. Si introduce valores múltiples con la misma suma de dígitos, se supone que debe ordenar a aquellos (y sólo aquellos) por orden decreciente de su valor original, no la suma de dígitos de este tiempo (las estancias de descanso lo mismo que antes).

¿Cómo puedo lograr esto con comparadores?

Mis listas y el mapa:

String filePath = args[0];

LineNumberReader br = new LineNumberReader(new FileReader(filePath));
LinkedHashMap<BigInteger, BigInteger> unsortedMap = new LinkedHashMap<BigInteger, BigInteger>();
List<BigInteger> inputList = new ArrayList<>();
List<BigInteger> DSList = new ArrayList<>();

if(br.ready()){
     while (true) {
        String line = br.readLine();
        if (line == null) {
            break;
        }

        BigInteger input = new BigInteger(line);
        inputList.add(input);
        DSList.add(methods.digitSum(input));

    }
}

for(int i = 0; i < inputList.size(); i++){
    unsortedMap.put(inputList.get(i), DSList.get(i));
}

for(BigInteger key : unsortedMap.keySet()){
    System.out.println(new BigDecimal(key).toPlainString() + " (Digit Sum: " + unsortedMap.get(key) + (")"));
}

methods.digitSum:

public static BigInteger digitSum(BigInteger number) {

        String digits = number.toString();
        int sum = 0;

        for(int i = 0; i < digits.length(); i++) {
            int digit = (int) (digits.charAt(i) - '0');
            sum = sum + digit;
        }

        return BigInteger.valueOf(sum);

}

La salida tiene que tener este aspecto:

x (suma de dígitos: y)
x (suma de dígitos: y)
...
x = valor entrado
y = suma de dígitos de x

Si necesita más información, no dude en preguntar.

Joakim Danielson:

Aquí es una solución con una clase simple y un comparador

class Values {
    BigInteger number;
    BigInteger digitSum;

    Values(BigInteger number, BigInteger sum) {
        this.number = number;
        this.digitSum = sum;
    }

    @Override
    public String toString() {
        return number + " (digit sun:" + digitSum + ")";
    }
}

Y a continuación, crear una lista con esta clase

 List<Values> inputList = new ArrayList<>();

y añadir objetos de valores a la lista utilizando el constructor al leer el archivo

Para la clasificación se puede crear un objeto Comparador como esto

Comparator<Values> compareSum = (Values v1, Values v2) -> {
   int result = v1.digitSum.compareTo(v2.digitSum);
   return result != 0 ? result : v1.number.compareTo(v2.number);           
};

y ordenar la lista en orden descendente

inputList.sort(compareSum.reversed());

Supongo que te gusta

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