0

学校のプロジェクトでは、ボートで到着する 50,000 個のコンテナのリストがあります。これらのコンテナーは、最も早い出発 DateTimes が一番上にあり、コンテナーがその上にあるように、リストで並べ替える必要があります。このリストは、それらを順番にピックアップするクレーンに使用されます。

私は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秒):

まず、DateTime で並べ替えます。

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;
}

これをより良い/より速い方法で実装したいと思います。したがって、ヒントをいただければ幸いです。:)

4

1 に答える 1

1

Comparatorおそらく、すべての基準を比較する単一のものでソートしたいと思うでしょう。例えば:

compareTo(other)        
    positionComparison = this.position.compareTo(other.position)
    if positionComparison != 0
        return positionComparison 
    return this.departureTime.compareTo(other.departureTime)
于 2012-12-14T05:00:55.700 に答える