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,Comparatorkillers
到底是什么?您是否有证据表明您的代码是次优的(与什么相比?)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]);
}