对于一个学校项目,我有一份乘船抵达的 50,000 个容器的 list 。 这些容器需要在列表中排序,使得最早的出发日期时间位于顶部,而其上方的容器位于其上方。 然后,该列表将用于起重机按顺序拾取它们。
我从 2 个 Collection.sort() 方法开始:
第一个让它们处于正确的 X>Y>Z 顺序
Collections.sort(containers, new Comparator<ContainerData>()
{
@Override
public int compare(ContainerData contData1, ContainerData contData2)
{
return positionSort(contData1.getLocation(),contData2.getLocation());
}
});
然后用另一个重新排序日期,同时记住位置:
Collections.sort(containers, new Comparator<ContainerData>()
{
@Override
public int compare(ContainerData contData1, ContainerData contData2)
{
int c = contData1.getLeaveDateTimeFrom().compareTo(contData2.getLeaveDateTimeFrom());
int p = positionSort2(contData1.getLocation(), contData2.getLocation());
if(p != 0)
c = p;
return c;
}
});
但是我从来没有让这个方法起作用..
我现在的工作相当快而且脏,并且需要很长时间来处理(所有 50k 需要 50 秒):
首先对日期时间进行排序:
Collections.sort(containers, new Comparator<ContainerData>()
{
@Override
public int compare(ContainerData contData1, ContainerData contData2)
{
return contData1.getLeaveDateTimeFrom().compareTo(contData2.getLeaveDateTimeFrom());
}
});
然后是一个校正函数,将顶部容器向上推:
containers = stackCorrection(containers);
private static List<ContainerData> stackCorrection(List<ContainerData> sortedContainerList)
{
for(int i = 0; i < sortedContainerList.size(); i++)
{
ContainerData current = sortedContainerList.get(i);
// 5 = Max Stack (0 index)
if(current.getLocation().getZ() < 5)
{ //Loop through possible containers above current
for(int j = 5; j > current.getLocation().getZ(); --j)
{ //Search for container above
for(int k = i + 1; k < sortedContainerList.size(); ++k)
if(sortedContainerList.get(k).getLocation().getX() == current.getLocation().getX())
{
if(sortedContainerList.get(k).getLocation().getY() == current.getLocation().getY())
{
if(sortedContainerList.get(k).getLocation().getZ() == j)
{ //Found -> move container above current
sortedContainerList.add(i, sortedContainerList.remove(k));
k = sortedContainerList.size();
i++;
}
}
}
}
}
}
return sortedContainerList;
}
我想以更好/更快的方式实现这一点。因此,任何提示都值得赞赏。 :)
最佳答案
我认为您可能想使用单个Comparator
来比较所有条件进行排序。例如:
compareTo(other)
positionComparison = this.position.compareTo(other.position)
if positionComparison != 0
return positionComparison
return this.departureTime.compareTo(other.departureTime)
关于Java 根据日期时间和 Z 位置对 "queue"列表进行排序(学校项目的一部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872786/