2016-04-19 6 views
0

私は乗り物共有システムを設計しようとしています。そのドライバ用>先マップ - ここにだから私のベースオブジェクト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を上書きする方法はありますか? UberComparableを実装している場合、私は上記のように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; 
    } 

} 
+0

それはすぐそこに言います。あなたの中間引数は、この場合はUber型のT型でなければなりません。 floatではなくUberオブジェクトに渡します。 – Roman

+0

2番目の引数は浮動小数点数ではなく、Uberオブジェクトでなければなりません。ドキュメントまたはエラー –

答えて

1

INT RINDEX = Collections.binarySearch(ULIST、TM、timeComparator)。

List<Uber>floatを検索することはできません。

あなたの選択肢...率直に言えば、それほど大きくありません。 tm値を含む偽のUberを作成し、それをCollections.binarySearchに渡すことができます。 Guavaのようなライブラリを使用して、Lists.transform(ubers, getTmFunction)と呼んでビューを作成し、それをCollections.binarySearchに渡すことができます。自分でバイナリ検索を再実装することができます。

+0

を読んでいただきありがとうございます。あなたの2番目の質問に反応して、 – AbtPst

+0

@AbtPstを編集してください:いいえ、それを行う方法はありません。 'Collections.binarySearch'は、_same type_の値をリスト要素として取ります。それは役に立たないものではありません。ほとんどの時間はあなたが持っているものです。それはあなたが持っているものではない奇妙な事例の一つを持っているだけです。 –

+0

これは意味があります。ありがとう – AbtPst