学校のプロジェクトでは、ボートで到着する 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;
}
これをより良い/より速い方法で実装したいと思います。したがって、ヒントをいただければ幸いです。:)