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 KomparatorComparator<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;
}
}
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
Das zweite Argument muss ein Uber-Objekt sein, kein Float. Lesen Sie die Dokumentation oder den Fehler –