2016-05-23 13 views
0

Ich möchte eine Liste basierend auf drei Anforderungen sortiert haben. Die Liste enthält das Objekt ROUTE, für das die folgenden drei Komponenten verwendet werden: Profit, Gesamtstrecke und eine Ganzzahl namens apr.Wie sortiere ich eine Liste basierend auf drei Anforderungen?

Ich möchte die Objekte so hinzufügen, dass die Liste von Anfang an geordnet bleibt.

Was ich kam mit nun die folgenden, wo ich möchte „ROUTE r“ in die Liste aus

for (int j = 0; j < POOL.size()-1; j++) 
    { 
     if (apr(r) > apr(j)) 
     { 
      // do nothing 
     } 
     else if (apr(r) < apr(j)) 
     { 
      POOL.add(j,r) 
     } 
     else if (apr(r) == apr(j)) 
     { 
      if (profit(r) > profit(j)) 
      { 
       // do nothing 
      } 
      else if (profit(r) < profit(j)) 
      { 
       POOL.add(j, r) 
      } 
      else if (profit(r) == profit(j)) 
      { 
       if (distance(r) > distance(j)) 
       { 
        // do nothing 
       } 
       else if (distance(r) < distance(j)) 
       { 
        POOL.add(j,r) 
       } 
       else if (distance(r) == distance(j)) 
       { 
        //add 
       } 
      } 
     } 

Könnte diese Arbeit gut hinzufügen?

+1

Haben Sie versucht, irgendetwas in Bezug auf Code? –

+0

Welche Sprache möchten Sie verwenden? (Wenn überhaupt?) –

+0

Ich habe über Code nachgedacht, konnte aber noch nichts finden. Ich schreibe in Eclipse (Java 1.8) @HopefulLlama –

Antwort

0

Sortierung in Java unter der Annahme: Vergleichbare und Vergleicher. Vergleichbar erstellt eine natürliche Reihenfolge Ihrer Elemente, je nach den gewünschten Kriterien. Comparator kann verwendet werden, um mehrere Bestellungen Ihrer Daten zu haben.

Beim Sortieren einer Java-Sammlung über die von einer Handvoll Sammlungen bereitgestellte Methode sort können Sie einen bestimmten Vergleicher verwenden. Wenn Sie nichts angeben, wird die Sammlung nach der natürlichen Reihenfolge Ihrer Objekte sortiert (über Vergleichbar).

Schauen wir uns jetzt die Implementierung dieser Dinge an.

Vergleichbare Version

public class Route implements Comparable<Route> { 
    private String apr; 
    private int distance; 
    private int profit; 

    @Override 
    public int compareTo(Route other) { 
     int aprCompare = apr.compareTo(other.apr); 
     if (aprCompare != 0)    return aprCompare; 
     else if (profit < other.profit)  return -1; 
     else if (profit > other.profit)  return 1; 
     else if (distance < other.distance) return -1; 
     else if (distance > other.distance) return 1; 
     else        return 0; 
    } 
} 

Vergleicher Version

Ein Komparator ist ein Objekt, das die Bestellung für Sie tut. Per Konvention unterscheidet sich ein Komparator von der Klasse, die er vergleicht. Also, lassen Sie uns einen schreiben:

public class RouteComparator implements Comparator<Route> { 

    @Override 
    public int compare(Route a, Route b) { 
     int aprCompare = a.getApr().compareTo(b.getApr()); 
     if (aprCompare != 0)      return aprCompare; 
     else if (a.getProfit() < b.getProfit())  return -1; 
     else if (a.getProfit() > b.getProfit())  return 1; 
     else if (a.getDistance() < b.getDistance()) return -1; 
     else if (a.getDistance() > b.getDistance()) return 1; 
     else          return 0; 
    } 
} 

Sortieren einer Liste

Sagen Sie ein paar unsortierte Daten in Ihrer Liste haben, und Sie müssen es sortieren, bevor neue einführen. Um eine List<Rout> list mit der Vergleichsschnittstelle zu sortieren, rufen Sie einfach list.sort(null). Wenn Sie einen Komparator verwenden möchten, rufen Sie list.sort(new RouteComparator()). Einfach, Ihre Liste ist effizient sortiert.

Wie zum Einfügen von Daten, während die Ordnung zu halten

Diese Liste ist, so ist der einfachste Weg zum Einfügen von Daten ist unter Beibehaltung bestellt ist es um die Liste zu durchlaufen, bis Sie eine Lücke finden, und legen Sie die neue Route in dieser Lücke. Wenn Sie eine ArrayList verwenden, können Sie dies effizienter durchführen, indem Sie eine binäre Suche implementieren, um nach der Lücke zu suchen.

Wenn Sie jedoch nicht an die Verwendung einer Liste gebunden sind und Ihre Routen eindeutig sind, können Sie ein TreeSet verwenden, bei dem es sich um eine geordnete Datenstruktur handelt.Was ist großartig ist, dass es auch Comparable Comparator verwendet, müssen Sie nur angeben, während Sie es erstellen:

TreeSet<Route> t = new TreeSet<>(); 
// Creates a new TreeSet with the natural ordering of Route 

TreeSet<Route> t = new TreeSet<>(new RouteComparator()); 
// Creates a new TreeSet using a Comparator 
1

Nun können Sie einen modifizierten Bubble-Sortieralgorithmus auf Ihre Liste anwenden. Dies ist ein Beispiel auf Java (nicht getestet), beruft sich auf zwei Schnittstellen ein Array von Objekt mit dem Wert, Gewinn und Distanzeigenschaften als ganze Zahlen

for(int i = 0; i < array.length; i++) { 
    for(int j = 0; j < array.length-1; j++) { 

     if(array[j].value > array[j+1].value || 
      (array[j].value == array[j+1].value && array[j].profit > array[j+1].profit) || 
      (array[j].value == array[j+1].value && array[j].profit == array[j+1].profit && array[j].distance > array[j+1].distance)) { 
      int k = array[j]; 
      array[j] = array[j+1]; 
      array[j+1] = k; 
     } 
    } 
} 
+0

Wenn jemand sagen könnte, warum es falsch ist, anstatt Downvote, würde es wirklich geschätzt werden – gbalduzzi

+1

Ich versuche, Ihren Code im Moment zu verstehen. Ich möchte ein Element einfügen, also würde ich sagen, ich brauche nur eine für die Schleife? –

+0

Dieser Code nimmt eine Liste von Elementen und sortiert sie nach Ihren Kriterien, das ist eine Implementierung der bekannten Bubble-Art algoritm (Sie können es googeln). Wenn Sie dann einen Wert zum Array hinzufügen und korrekt sortiert halten möchten, können Sie das neue Element als erstes Array hinzufügen und dann nur die interne for-Schleife in meinem Beispiel verwenden. – gbalduzzi

Verwandte Themen