gpt4 book ai didi

java - 当对象放入 ArrayList 时对其进行排序

转载 作者:行者123 更新时间:2023-12-02 03:02:25 24 4
gpt4 key购买 nike

我目前正在开发一个类,其中包含一个“add”方法,该方法将我的特定对象添加到我的 ArrayList 中,这是在我的构造函数中实例化的字段。目的显然是将对象添加到ArrayList中,但同时将对象添加到ArrayList不断排序的位置。这些对象通过从其类中名为 getCompany() 的访问器方法接收的字符串进行比较。我无法理解我将如何去做这件事。我的实验代码如下:

public class WeeklyOrders {
private List<DistributionOrder> orders;
public WeeklyOrders(){
orders= new ArrayList<DistributionOrder>();
}
public void add(DistributionOrder dOrder){
int maxPos=0;
int minDiff=0;
for(int i=0;i<orders.size();i++){
String comp=orders.get(i).getCompany();
int diff=comp.compareTo(dOrder.getCompany());
if(diff<minDiff){
minDiff=diff;
maxPos=i;
}
}
orders.add(maxPos,dOrder);
}
public String toString(){
String s="";
for(int i=0;i<orders.size();i++){
s=s+orders.get(i).getCompany()+"\t";
}
return s;
}
}

最佳答案

您错误地使用了 compareTo 方法。您不应该将它的返回值相互比较:compareTo 结果的唯一合理用法是将其与零进行比较。如果该元素小于传递的元素,则返回任何负数;如果该元素大于传递的元素,则返回任何正数。也许您想要这样的东西:

int maxPos=-1;
for(int i=0;i<orders.size();i++){
String comp=orders.get(i).getCompany();
int diff=comp.compareTo(dOrder.getCompany());
if(diff<0){
maxPos=i;
} else break; // no need to continue iterating list after that
}
orders.add(maxPos+1,dOrder);

请注意,您应该仔细考虑极端情况:如果 dOrder 成为 orders 的第一个和最后一个元素,将会发生什么。

最后请注意,考虑到列表始终是排序的,您可以考虑使用 Collections.binarySearch()使用自定义比较器的方法:

int maxPos = Collections.binarySearch(orders, dOrder,
Comparator.comparing(DistributionOrder::getCompany));
if(maxPos < 0) maxPos = - maxPos - 1;
orderds.add(maxPos, dOrder);

这样会更快。

关于java - 当对象放入 ArrayList 时对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42262631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com