Java快速添加和排序列表的方法

Java快速添加和排序列表的方法,java,sorting,artificial-intelligence,Java,Sorting,Artificial Intelligence,我有下面的代码来排序棋盘游戏中的动作。在我看来,它可以进行高度优化: private List<Move> sortMoves(List<Move> moves, int depth) { List<Move> sorted = new ArrayList<Move>(); if (moves.size() == 0) return sorted; List

我有下面的代码来排序棋盘游戏中的动作。在我看来,它可以进行高度优化:

    private List<Move> sortMoves(List<Move> moves, int depth)
    {
        List<Move> sorted = new ArrayList<Move>();

        if (moves.size() == 0)
            return sorted;

        List<Move> primary = new ArrayList<Move>();
        List<Move> rest = new ArrayList<Move>();

        for(int i = 0; i < moves.size(); i++)
        {
            if (killers.primary[depth] != null && moves.get(i).equals(killers.primary[depth]))
                primary.add(moves.get(i));          

            else
                rest.add(moves.get(i));
        }

        sorted.addAll(primary);
        sorted.addAll(rest);

        return sorted;
    }
私有列表排序移动(列表移动,整数深度)
{
列表排序=新建ArrayList();
if(moves.size()==0)
返回排序;
List primary=new ArrayList();
List rest=new ArrayList();
对于(int i=0;i
是否有更好、更有效的方法实现上述目标(即,将两个列表相交并返回一个已排序的列表)

注意:该函数的目标是删除在移动列表中找到的杀手移动(主要),然后返回一个新列表,首先返回杀手移动,然后返回原始移动列表中的列表。

要对列表进行排序,请快速尝试

要快速排序列表,请尝试


如果您的
移动量不太大,则当前实现看起来正常。其复杂性为O(n)。这里唯一的缺点是由于三个额外列表(即<代码>主要
其余
排序


通过使用
集合.sort(List List,Comparator可以节省一些空间复杂性,如果
移动量不太大,则当前实现看起来正常。其复杂性为O(n)。唯一的缺点是由于三个额外列表造成的空间复杂性,即
rest
排序


使用
集合可以节省一些空间复杂性。sort(List List,Comparator
killers
到底是什么?您是否有证据表明您的代码是次优的(与什么相比?)killers是一个具有类型为Move[]的公共属性(称为primary)的类所以你没有对整个列表进行排序?只是根据某个条件对其进行拆分,以确定列表中的两个不同“类型”?我看到的一个选择实际上不会做任何事情,那就是去掉主列表,直接添加到for循环中的排序。然后只添加全部(rest)最后。另一件事-什么样的列表是
移动
。如果它是一个ArrayList,那么你应该可以,但是LinkedList.get不是你想做的很多事情。你也可以初始化结果数组以减少分配,但是除非你有证据,否则这可能不会改善太多
killers
到底是什么?您是否有证据表明您的代码是次优的(与什么相比?)killers是一个具有类型为Move[]的公共属性(称为primary)的类,所以您没有对整个列表排序?只是根据识别两种不同“类型”的某个条件将其拆分在列表中?我看到的一个选择实际上不会做任何事情,那就是去掉主列表,直接在for循环中添加到sorted。然后只添加全部(rest)最后。另一件事-什么样的列表是
移动的
。如果它是ArrayList,那么你应该可以,但是LinkedList.get不是你想做的很多事情。你也可以初始化你的结果数组,以减少分配,但是除非你有证据,否则这可能不会有太大的改进通过提供一个比较器,该比较器与OP的意图具有相同的影响。更易维护,但不明显更快。您应该通过提供一个比较器来完成您的答案,该比较器与OP的意图具有相同的影响。更易维护,但不明显更快
private void sortMoves(final List<Move> moves, final int depth)
{
    Collections.sort(moves, new Comparator<Move>() {
        @Override
        public int compare(Move o1, Move o2) {

            if(killers.primary[depth] != null && moves.get(i).equals(killers.primary[depth])) {

                return 0;
            } else {

                return 1;
            }
        }
    });       
}
private void sortMoves(final List<Move> moves, final int depth)
{

    int i = 0;
    int j = moves.size() - 1;

    while(i < j) {

        while(equalsKillersPrimary(moves.get(i), depth))
            i++;

        while(!equalsKillersPrimary(moves.get(j), depth))
            j--;

        swap(moves, i, j);
    }
}

private boolean equalsKillersPrimary(Move move, int depth) {

    return killers.primary[depth] != null && move.equals(killers.primary[depth]);
}