2017-02-16 4 views
0

Ich arbeite gerade an einer Klasse, die eine Methode "add" enthält, die mein spezifisches Objekt zu meiner ArrayList hinzufügt, einem Feld, das in meinem Konstruktor instanziiert ist. Der Zweck besteht darin, das Objekt offensichtlich der ArrayList hinzuzufügen, aber gleichzeitig fügt es das Objekt zu der Position hinzu, an der die ArrayList ständig sortiert wird. Die Objekte werden durch einen String verglichen, der von einer Zugriffsmethode innerhalb der Klasse getCompany() empfangen wird. Ich habe Probleme zu verstehen, wie ich das machen würde. Mein experimenteller Code folgt:Sortierung einer ArrayList, während Objekte in sie eingefügt werden

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

und ...........? –

+0

Wenn die Liste immer sortiert ist, glaube ich nicht, dass Sie diese 'if (diff

+0

Ich würde nur am Ende hinzufügen und tun Sie entweder 'orders.sort (Comparator.comparing (DistributionOrder :: getCompany)) 'oder der entsprechende Aufruf' Collections.sort() '. Erfinde das Rad nicht neu. –

Antwort

2

Sie compareTo Methode falsch verwenden. Sie sollten die Rückgabewerte nicht miteinander vergleichen: Die einzige sinnvolle Verwendung von compareTo ist, dass Sie das Ergebnis mit Null vergleichen. Es gibt any negative Zahl, wenn dieses Element weniger als Element oder positive Zahl ist, wenn dieses Element größer als eins ist. Wahrscheinlich wollten Sie so etwas wie diese:

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

Beachten Sie, dass Sie sorgfältig über Eckfällen denken sollen: was geschehen wird, wenn dOrder erstes werden soll und sehr letztes Element der orders.

Schließlich ist zu beachten, dass angesichts der Tatsache, dass die Liste immer sortiert ist, können Sie mit benutzerdefinierten Komparator mit Collections.binarySearch() Methode betrachten:

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

Dies wäre schneller.

+0

Vielen Dank das war sehr hilfreich. –

Verwandte Themen