私は乗り物共有システムを設計しようとしています。そのドライバ用>先マップ - ここにだから私のベースオブジェクトJava Collectionsバイナリー検索:コレクションCollectionsのbinarySearchメソッドは引数には適用されません
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;
}
}
で、各オブジェクトは、ドライバと関連付けられた時間<を持っています。最終的に、私はそのようなオブジェクトのリストを時間フィールド、すなわちツリーマップのキーでソートしたいと思っています。ここ
とは、私は基本的に上記
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--;
}
}
}
用に作成されたイテレータクラスで、コンパレータ
Comparator<Uber> timeComparator = new Comparator<Uber>(){
public int compare(Uber u1, Uber u2) {
return (int) (u1.getTsum()-u2.getTsum());
}
};
と私は、内部ツリーマップのキーでソートしようとしています。しかし、私はどのように私は私の実装を修正する必要があり
int rindex=Collections.binarySearch(uList, tm, timeComparator);
で
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>)
このエラーが出ますか?
フォローアップ
はCollections.binarySearch
を上書きする方法はありますか? Uber
がComparable
を実装している場合、私は上記のようにcompareメソッドを定義しますか?自動的にtime
ディメンションで検索する必要はありませんか?さもなければ、並べ替えのためにカスタムコンパレータを定義することのメリットは何ですか?リストを特定の方法で並べ替える唯一の理由は、後でそれを効率的に検索できることです。
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;
}
}
それはすぐそこに言います。あなたの中間引数は、この場合はUber型のT型でなければなりません。 floatではなくUberオブジェクトに渡します。 – Roman
2番目の引数は浮動小数点数ではなく、Uberオブジェクトでなければなりません。ドキュメントまたはエラー –