2016-04-19 3 views
0

Ich versuche, ein Mitfahrsystem zu entwerfen. Hier ist mein BasisobjektJava-Sammlungen binäre Suche: Die Methode binarySearch in der Art Collections ist nicht anwendbar für die Argumente

package rider; 

import java.util.TreeMap; 

public class Uber{ 

    String driver; 
    TreeMap<Float,String> destination; 

    public Uber(String d) 
    { 
     driver=d; 
     destination = new TreeMap<Float,String>(); 
    } 

    private void addTimeDest(float tm, String dest) 
    { 
     destination.put(tm, dest); 
    } 

    float getTsum() { 

     float tsum=0; 

     for (float f : this.destination.keySet()) 
      tsum+=f; 
     return tsum; 
    } 

} 

So hat jedes Objekt einen Fahrer und eine zugehörige Zeit < -> Zieleingabekarte für diesen Treiber. Letztendlich möchte ich eine Liste solcher Objekte nach dem Zeitfeld, d.h. dem Schlüssel der Treemap, sortieren.

und hier ist die Iterator-Klasse i

package rider; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 

public class UberIterator implements Iterator<Uber> { 

    int currIndex=0; 
    ArrayList<Uber> uList; 
    Comparator<Uber> timeComparator = new Comparator<Uber>(){ 
      public int compare(Uber u1, Uber u2) { 
       return (int) (u1.getTsum()-u2.getTsum()); 
     } 
      }; 
    public UberIterator(ArrayList<Uber> nList) 
    { 
     uList=nList; 
     Collections.sort(uList,timeComparator); 
    } 

    public boolean hasNext() { 

     return currIndex<uList.size(); 
    } 

    public Uber next() { 
     return uList.get(currIndex++); 
    } 

    @Override 
    public void remove() { 
     uList.remove(currIndex--); 
    } 

    public void remove(String d) { 

     int rindex=-1; 
     for(int u=0 ; u<currIndex; u++) 
     { 
      if(uList.get(u).driver.equals(d)) 
      { 
       rindex=u; 
       break; 
      } 
     } 

     if(rindex<0) 
      System.out.println("Driver not found."); 
     else 
     { 
      uList.remove(rindex); 
      currIndex--; 
     } 
    } 

    public void remove(float tm) { 

     int rindex=Collections.binarySearch(uList, tm, timeComparator); 

     if(rindex<0) 
     { 
      System.out.println("Exact time not found. Closest will be removed."); 

     } 
     else 
     { 
      uList.remove(rindex); 
      currIndex--; 
     } 
    } 

} 

grundsätzlich für die oben

erstellt, mit dem Komparator

Comparator<Uber> timeComparator = new Comparator<Uber>(){ 
      public int compare(Uber u1, Uber u2) { 
       return (int) (u1.getTsum()-u2.getTsum()); 
     } 
      }; 

i durch den Schlüssel des internen treemap zu sortieren versuchen. aber ich bekomme diesen Fehler

The method binarySearch(List<? extends T>, T, Comparator<? super T>) in the type Collections is not applicable for the arguments (ArrayList<Uber>, float, Comparator<Uber>) 

bei

int rindex=Collections.binarySearch(uList, tm, timeComparator); 

wie soll ich meine Implementierung korrekt?

Follow Up

ist es eine Möglichkeit, Collections.binarySearch außer Kraft zu setzen? Was ist, wenn Uber implementiert Comparable und ich definiere die Vergleichsmethode wie oben? Sollte das nicht automatisch mit der time Dimension suchen? Sonst was ist der Vorteil, benutzerdefinierte Vergleicher für das Sortieren zu definieren? Der einzige Grund, warum ich die Liste auf eine bestimmte Art sortieren möchte, ist, sie später effizient suchen zu können.

package rider; 

import java.util.TreeMap; 

public class Uber implements Comparable<Uber> { 

    String driver; 
    TreeMap<Float,String> destination; 

    public Uber(String d) 
    { 
     driver=d; 
     destination = new TreeMap<Float,String>(); 
    } 

    private void addTimeDest(float tm, String dest) 
    { 
     destination.put(tm, dest); 
    } 

    public int compareTo(Uber u) { 

     return (int) (this.getTsum()-u.getTsum()); 
    } 

    float getTsum() { 

     float tsum=0; 

     for (float f : this.destination.keySet()) 
      tsum+=f; 
     return tsum; 
    } 

} 
+0

Es sagt es genau dort. Ihr mittleres Argument muss ein T-Typ sein, der in diesem Fall ein Uber-Typ ist. Übergeben Sie ein Uber-Objekt anstelle eines Floats. – Roman

+0

Das zweite Argument muss ein Uber-Objekt sein, kein Float. Lesen Sie die Dokumentation oder den Fehler –

Antwort

1

int RINDEX = Collections.binarySearch (ulist, TM, timeComparator);

Sie können nicht für eine float in einem List<Uber> suchen.

Ihre Alternativen ... sind ehrlich gesagt nicht so toll. Sie könnten eine falsche Uber mit Ihrem tm Wert erstellen und diese an Collections.binarySearch übergeben. Sie könnten eine Bibliothek wie Guava verwenden, Lists.transform(ubers, getTmFunction) aufrufen, um eine Ansicht zu erstellen, und diese an Collections.binarySearch übergeben. Sie könnten die Binärsuche selbst neu implementieren.

+0

danke, siehe die Bearbeitung – AbtPst

+0

@AbtPst, als Reaktion auf Ihre zweite Frage: Nein, es gibt keinen Weg, das zu tun. 'Collections.binarySearch' nimmt einen Wert des _same_type_ als Listenelemente. Das macht es nicht nutzlos - meistens hast du es. Du hast nur einen der seltsamen Fälle, in denen das nicht das ist, was du hast. –

+0

ok, das macht Sinn. Vielen Dank – AbtPst

Verwandte Themen