2017-02-16 46 views
0

我目前正在處理一個類,其中包括一個方法「添加」,將我的特定對象添加到我的ArrayList,這是一個字段在我的構造函數中實例化。目的是顯然將對象添加到ArrayList中,但同時它將對象添加到ArrayList不斷排序的位置。這些對象將通過一個名爲getCompany()的類中的訪問器方法接收到的字符串進行比較。我無法理解如何去做這件事。我的實驗代碼如下:排序ArrayList的對象正在被放入它們

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

...........? –

+0

如果列表總是被排序,我不認爲你需要這個'if(diff

+0

我只是在最後添加並且執行'orders.sort(Comparator.comparing(DistributionOrder :: getCompany) )'或相應的'Collections.sort()'調用。不要重新發明輪子。 –

回答

2

您正在使用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); 

這會更快。

+0

謝謝,這真的很有幫助。 –