2011-07-08 6 views
0

Scalaのimmutable.VectorをJavaで使用しようとしています。誰もこれのための簡単なJavaコードを投稿できますか?Javaのscala.collection.immutable.Vectorの中に要素を追加する

これまで私が試したことです。

  1. 試したVector Builder。行うには良いまったく違う方法はあり

    Vector<Long> part1= orignal.slice(0, indexOfMid); 
    Vector<Long> part2 = orignal.slice(indexOfMid, orignal.size()); 
    orignal= part2.appendFront(1L); 
    Vector <Traversable<Long>> vectorOfTraversables = Vector.empty(); 
    vectorOfTraversables.appendFront(orignal.toTraversable()); 
    vectorOfTraversables.appendFront(part1.toTraversable()); 
    orignal= Vector.concat(vectorOfTraversables.toSeq()); 
    

    私は次のエラー

     
    Exception in thread "main" java.lang.NoSuchMethodError: 
    scala.collection.immutable.Vector.concat(Lscala/collection/Seq;)Lscala/collection/immutable/Vector; 
    

    を取得しています:

  2. は、私が試したもののサンプルがある。ここ

​​しようとしましたこの?それとも、私はどこかで間違っていますか?

+0

あなたは不変のベクトルを変更することはできないので、 'concat'は意味をなさないでしょう。あなたは* new *ベクトルを完全に構築する必要があります。 –

+0

私は新しいベクトルを作成するためにforループを再度使用することを意味しますか?それは私が何らかのポイントで追加を使用することができない場合です。これを行うには他にもいくつかの方法がありますか? –

+0

質問は似ているようです:http://stackoverflow.com/questions/6591614/adding-element-at-the-middle-of-scala-collection-immutable-list-in-javaそれはいくつかの宿題ですか?はいの場合は、適切なタグを使用します。 – paradigmatic

答えて

1

NoSuchMethodError、またはLinkageErrorに由来するその他のエラーが表示された場合は、クラスパスのライブラリとは異なるバージョンのライブラリに対してコードがコンパイルされたことを意味します。

これはJavaライブラリではあまり一般的ではありませんが、主に特性のためにバイナリ互換性を達成することは非常に難しいScalaでは非常に一般的です。—

* EDIT *ランタイム・クラスパスは、コンパイルのクラスパスとまったく同じScalaのバージョンが含まれている、とあなたは少なくともさらに取得する必要がありますを確認します。しかし、その後、再び、あなたは非常に遠く取得することはありません痛みの多くはありません。 JavalandのScalaコレクションを本当に使用する必要がある場合は、おそらくJavaでインターフェイスを作成し、Scalaから実装することをお勧めします。

+0

ありがとうアレックス、私はちょうど私のマシン上のスカラライブラリの1つのバージョンがあります。他の手がかりは?問題を解決するのではなく、代わりに私の仕事の解決策を教えてください。 –

2

これは動作するはずです:

Vector<Long> part1 = original.slice(0, indexOfMid); 
Vector<Long> part2 = original.slice(indexOfMid, original.size()); 
VectorBuilder<Long> builder = new VectorBuilder<Long>(); 
builder.$plus$plus$eq(part1); 
builder.$plus$eq(new Long(100)); 
builder.$plus$plus$eq(part2); 
Vector<Long> result = builder.result(); 

VectorBuilderCanBuildFromまたは反復パラメータを使用しない方法を提供し、それは、Javaから使用する方がはるかに簡単です。

ちなみに、NoSuchMethodErrorはおそらく事実のためです。concatは、コンパニオンオブジェクトのメソッドです。 scala.collection.immutable.Vector$をインポートし、これを試してください:

Vector$.MODULE$.concat(vectorOfTraversables.toSeq()); 
+0

私は 'slice'の代わりに' splitAt'を使いました。また、なぜあなたは '1'でスライスを開始していますか? –

+0

@ダニエル、1から始まって、タイプミスが修正されました。 'splitAt'についての公正な点は、私はJava側からScalaタプルを扱う気がしませんでした。 – huynhjl

関連する問題