2016-10-30 5 views
1

私のオーバーライドequals()が2つのオブジェクトが同じかどうかを判断するインデックスを追加しようとしています。cqengine cant index by equals

Car.java

public static class Car { 

     final String id; 
     private String name; 

     public Car(String id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public String getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public static final Attribute<Car, Car> CAR = new SimpleAttribute<Car, Car>() { 
      @Override 
      public Car getValue(Car car, QueryOptions queryOptions) { 
       return car; 
      } 
     }; 

     @Override 
     public String toString() { 
      return "Car{" + "id=" + id + ", name=" + name + '}'; 
     } 

} 

Fetcher.java

public static final ResultSet<Car> get(final IndexedCollection<Car> indexedCollection, final Car car) { 
    return indexedCollection.retrieve(QueryFactory.equal(Car.CAR, car)); 
} 

Main.java

public static void main(String args[]) { 
      IndexedCollection<Car> cars = new ConcurrentIndexedCollection<>(); 
      cars.addIndex(NavigableIndex.onAttribute(Car.CAR)); 
} 

proble mはこの行にありますcars.addIndex(NavigableIndex.onAttribute(Car.CAR));ここで、エラーメッセージはno suitable method found for onAttribute(Attribute<Car,Car>)です。私はここで何か間違っているのですか、代わりに使用しなければならない別の呼び出しがありますか?

+0

'IndexedCollection は'車が必要cars'私が正しくあなたを理解している場合しかし...ここでは、可能な解決策であります'属性 CAR'は車ではありません。これはSimpleEntryのようなものです。 'getValue();'をコールしてみてください – asdf

+0

@asdf: 'getValue();'はどこで正確に呼び出しますか? – Hooli

+0

次の例を参照してください:[Car](https://github.com/npgall/cqengine/blob/master/code/src/test/java/com/googlecode/cqengine/examples/introduction/Car.java)と[はじめに](https://github.com/npgall/cqengine/blob/master/code/src/test/java/com/googlecode/cqengine/examples/introduction/Introduction.java) – asdf

答えて

1

実際に有用なインデックスではないので、cars.addIndex(NavigableIndex.onAttribute(Car.CAR));を削除してください。これは開発者の動機付けではないと思います。 CAR_IDCAR_NAMEの属性を作成し、比較のためにクエリを作成する必要があります。この場合、私はあなたが期待しているものを達成するために乱用しますIndexedCollectionは簡単なSetです。

オーバーライドは車に等しい:

class Car { 
    private final int id; 
    private String name; 
    public Car(int i, String name) { 
     this.id = i; 
     this.name = name; 
    } 
    public int getId() { 
     return id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    }  
    @Override 
    public boolean equals(Object obj) { 
     if(this == obj) return true; 
     if(obj == null) return false; 
     if (!(obj instanceof Car)) return false;   
     Car car = (Car) obj;   
     if(car.getId() == this.getId()) 
      if(car.getName().equals(this.getName())) 
       return true;   
     return false; 
    } 
    public static final Attribute<Car, Car> CAR = new SimpleAttribute<Car, Car>() { 
     @Override 
     public Car getValue(Car car, QueryOptions queryOptions) { 
      return car;   
     } 
    }; 
    @Override 
    public String toString() { 
     return "Car{" + "id=" + id + ", name=" + name + '}'; 
    } 
} 

メイン:

IndexedCollection<Car> cars = new ConcurrentIndexedCollection<>(); 
cars.add(new Car(1, "test")); 
cars.add(new Car(2, "test2")); 
cars.add(new Car(3, "test3"));  
Car s = new Car(2, "test2"); 
ResultSet<Car> cs= cars.retrieve(QueryFactory.equal(Car.CAR, s)); 
cs.forEach(c -> System.out.println(c.toString()));