在Java中的scala.collection.immutable.Vector中间添加元素

时间:2011-07-08 02:15:27

标签: java scala vector insert

我正在尝试在Java中使用Scala的immutable.Vector。任何人都可以发布一个简单的Java代码吗?

这是我迄今为止所尝试过的。

  1. 尝试Vector Builder
  2. 尝试Vector.concat(Seq<Traversable <A>>)
  3. 以下是我尝试过的示例:

    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 :(得分: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();

VectorBuilder提供了不使用CanBuildFrom或重复参数的方法,因此从Java中使用起来要容易得多。

顺便说一下,NoSuchMethodError可能是因为concat是伴随对象的一种方法。导入scala.collection.immutable.Vector$并尝试此操作:

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

答案 1 :(得分:1)

如果您看到NoSuchMethodError或任何其他来自LinkageError的错误,则表示您的代码是针对库中不同版本的库编译的。

这在Java库中有点不常见,但它在Scala中非常常见,其中二进制兼容性很难实现 - 主要是因为特性。

确保您的运行时类路径包含与编译类路径完全相同的Scala版本,并且至少应该更进一步。*

* 编辑:但是,再说一遍,如果没有很多痛苦,你就不会走得太远。如果你真的需要使用Javaland的Scala集合,我认为最好的方法可能就是用Java编写一个接口,并用Scala实现它。