【问题标题】:How I can sort an ArrayList of int arrays?如何对 int 数组的 ArrayList 进行排序?
【发布时间】:2020-02-01 22:49:08
【问题描述】:

我有这个代码。我正在处理 N-Queen 问题。

问题是当我想按屏幕显示结果时,数组没有排序。但在这段代码中,我无法使用 Comparator 对它们进行排序。这很奇怪,因为在其他类中它使用 Comparator 可以完美地工作,但在这里它不起作用。希望有人可以帮助我。提前致谢。

import java.util.*;

public class NReinas {

public static void resolverReinas(int n){

    String[][] tablero;

    tablero = generarTablero(n);
    ubicarReina(tablero, 0, n);
}

public static void ubicarReina(String[][] tablero, int etapa, int n){

   ArrayList <int[]> resultados = new ArrayList<>();

    for(int i = 0; i < tablero.length; i++){
        if(isValido(tablero, i, etapa)){
            tablero[i][etapa] = "R";


            if(etapa < tablero.length - 1){
                ubicarReina(tablero, etapa + 1, n); //Recursividad
            }else {
                resultados.add(devolverSolucion(tablero, n));
            }
            tablero[i][etapa] = " "; //Backtracking: vaciamos el tablero
        }
    }

    //The ArrayList I want to order by int arrays
    for (int[] r : resultados) {
        System.out.println(Arrays.toString(r));
    }


}

public static boolean isValido(String[][] tablero, int i, int etapa){
    for(int x = 0; x < etapa; x++){
        if(tablero[i][x].equals("R")){
            return false;
        }
    }

    for(int j = 0; j < tablero.length && (i-j) >= 0 && (etapa-j) >=0; j++){
        if(tablero[i - j][etapa - j].equals("R")){
            return false;
        }
    }

    for(int j = 0; j < tablero.length && (i + j) < tablero.length && etapa - j >= 0; j++){
        if(tablero[i + j][etapa - j].equals("R")){
            return false;
        }
    }

    return true;
}

public static String[][] generarTablero(int length){
    String[][]res = new String[length][length];
    for (int i = 0; i < res.length; i++) {
        for (int j = 0; j < res.length; j++) {
            res[i][j] = " ";
        }
    }
    return res;
}

public static int[] devolverSolucion(String[][] tablero, int n){

    int[] solucion = new int[n];

    for (int i = 0; i < tablero.length; i++) {
        for (int j = 0; j < tablero.length; j++) {

            if(tablero[i][j] == "R"){
                solucion[i] = j;
            }
        }

    }
    return solucion;
}

}

【问题讨论】:

  • 您的代码中没有显示排序操作或比较器。

标签: arraylist comparator


【解决方案1】:

尝试使用 Integer 代替 int 并将数组值保存在 List 上,这样您就可以对它们进行排序

List<Integer> list = Arrays.asList(solucion);
Collections.sort(list);

如果你坚持使用和数组,你可以将列表重新转换为数组

(Integer[]) list.toArray();

【讨论】:

  • 谢谢。但我不想将值排序到数组中,而是将数组排序到 ArrayList 中。
  • toArray()(不带参数)的约定是返回一个Object[]类型的对象。由于某些实现中的错误,通过Arrays.asList(…) 将其投射到包含Integer[] 的列表上的Integer[] 恰好可以工作。从 Java 9 开始,此问题已得到修复,(Integer[]) list.toArray() 将与其他所有集合一样失败并返回 ClassCastException
猜你喜欢
  • 2011-10-05
  • 2017-03-15
  • 2013-12-15
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多