Java 根据日期时间和 Z 位置对 "queue"列表进行排序(学校项目的一部分)

标签 java list queue

对于一个学校项目,我有一份乘船抵达的 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/

相关文章:

java - 如果一个元素更改位置,则对两个 ArrayList 进行排序,另一个 arraylist 中的第二个元素也更改位置

python - 如何在python中交叉2个二维数组?

java - java世界有类似celery的任务队列吗?

java - 使用 Jackson 序列化通用接口(interface)子类

java - 可选参数 jpa 2.1

java - 错误 : Could not read [class java. lang.String];嵌套异常是 org.springframework.oxm.UnmarshallingFailureException

c# - string.split 返回一个 string[] 我想要一个 List<string> 是否有一个衬垫可以将数组转换为列表?

python - 返回最长连续的测距整数序列

ios - dispatch_queue 和返回数据

C使用Queue的单链表