我目前正在开发一个类,其中包含一个“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/