2012-04-06 8 views
1

http://www.savarese.com/software/libssrckdtree-j/をJrubyファイル内で実行しようとしています。jruby Javaライブラリを追加する

私のコードは次のようなものになります。私はこのコードを実行すると

require 'java' 
require 'libssrckdtree-j-1.0.2.jar' 

GenericPoint = Java::com.savarese.spatial.GenericPoint 
KDTree = Java::com.savarese.spatial.KDTree 
NearestNeighbors = Java::com.savarese.spatial.NearestNeighbors 

tree = KDTree.new 

def generate_points(tree, size) 
    size.times do 
    x = rand(100) 
    y = rand(100) 
    point = GenericPoint.new(x, y) 
    tree.put(point, point.to_s) 
    end 
end 

generate_points(tree, 20000) 


nearest = NearestNeighbors.new() 
point = [1,1] 

nearest.get(tree, point, 1, false) 

は、しかし、私は

NameError: no method 'get' for arguments (com.savarese.spatial.KDTree,org.jruby.RubyArray,org.jruby.RubyFixnum,org.jruby.RubyBoolean) on Java::ComSavareseSpatial::NearestNeighbors 
    (root) at kdjava.rb:25 

取得私はgetを使用すると言うライブラリのドキュメントとして取得いけない、と私KDtreeのために木の上に置くことを使用し、それは働いた。

私がしようとしているのは、このライブラリを使用してkdツリーに一連のlat lngを構築し、別のlat lngをクエリしてKDツリー内の最も近い隣を見ることです。

私はRubyでも大丈夫ですが、私はJavaを吸っています。私はこれらのより高速なライブラリを利用するためにJrubyを使用しています。

+0

* "これまでのところ私のコードは次のように見える:" * "私たちはこの曲を手に入れたが、このような小さなものになる"とは、酔っているブルースのプレイヤーにとっては良いリードであるかもしれない。テクニカルフォーラムで多くの回答を得ることができます。より良い結果を得るためには、「[SSCCE](http://sscce.org/)はこのように正確に読み取られます」と置き換えてください。 ..ブルースクラブのために、別のブルボンを沈めて、Eフラットに行ってください。 –

+0

touche - 公平なコメント –

答えて

2

api documentation for NearestNeighbor#get()は、すべてのJava型であるKDTree、P、int、boolean型の4つの引数をとることを示します。

エラーメッセージは、KDTree、RubyArray、RubyFixnum、RubyBooleanで渡されたことを示します。だから、KDTreeは大丈夫です。私はJRubyが自動的にFixnumとBooleanを適切なJava型に強制すると信じています。これにより、メソッドがPを予期するRubyArrayを渡す場所の2番目の引数が残されます。

NearestNeighborsのドキュメントは、Pが汎用タイプのP extends Point<Coord>であることを示しています。 Pointはインターフェイスです。 GenericPointはそのインタフェースを実装しています。だからではなく、[1,1]を渡す、Java::com.savarese.spatial.GenericPoint.new(1,1)

編集渡してみてください:ビットさらに探し

GenericPointCoordで作成する必要があり、他のジェネリック型Coord extends java.lang.Comparable<? super Coord>。 Javaでは、プリミティブ型のint(高速)とボックス化されたオブジェクトjava.lang.Integerの2種類のintがあります。 IntegerGenericPointで必要とされるComparableインターフェイスを実装しています。私は、次のことを実行しているすべてのエラーを取得できませんでした:

require 'java' 
require 'libssrckdtree-j-1.0.2.jar' 

GenericPoint = Java::com.savarese.spatial.GenericPoint 
KDTree = Java::com.savarese.spatial.KDTree 
NearestNeighbors = Java::com.savarese.spatial.NearestNeighbors 

def box(i) 
    java.lang.Integer.new(i) 
end 

tree = KDTree.new 

def generate_points(tree, size) 
    size.times do 
    x = box(rand(100)) 
    y = box(rand(100)) 
    point = GenericPoint.new(x, y) 
    tree.put(point, point.to_s) 
    end 
end 

generate_points(tree, 20000) 


nearest = NearestNeighbors.new() 
point = GenericPoint.new(box(1), box(1)) 

nearest.get(tree, point, 1, false) 

上記に関するメモを、通常はJavaで箱入りIntegerを作成するために、1はjava.lang.Integer.valueOf(int)を使用しています。私以外の理由から、intNativeException: java.lang.ClassCastException: org.jruby.RubyFixnum cannot be cast to java.lang.Numberを使用した場合と同じエラーが発生しました。だから、代わりにコンストラクタ、java.lang.Integer.newを使用しました。

+0

ありがとう - しかし、それは引数に間違っている - 引数ではない?私が一般的な点に変更するとき、それは同じ –

+0

+1をやっています。いい答え! –

関連する問題