我原以为这很容易实现,但现在开始很痛苦了。
我有一个数组可写的子类如下:
public class VertexDistanceArrayWritable extends ArrayWritable {
public VertexDistanceArrayWritable() {
super(VertexDistanceWritable.class);
}
public VertexDistanceArrayWritable(VertexDistanceWritable[] v) {
super(VertexDistanceWritable.class, v);
}
}
一个可写的子类,比如:
public class VertexDistanceWritable implements Writable {
//Implements write, readFields, and some custom functions that aren't used yet
}
在我的giraph计算函数中,消息是vertexdistancearraywritable的。我想遍历每个vertexdistancewritable消息(vertexdistancearraywritable)。这是我的计算函数:
@Override
public void compute(Vertex<Text, MapWritable, FloatWritable> vertex,
Iterable<VertexDistanceArrayWritable> messages) throws IOException {
for(VertexDistanceArrayWritable message : messages) {
for(VertexDistanceWritable distEntry : message) {
//Do stuff with distEntry
}
}
//do other stuff
vertex.voteToHalt();
}
编译代码时,出现以下错误:
for-each not applicable to expression type
for(VertexDistanceWritable distEntry : message) {
required: array or java.lang.Iterable
found: VertexDistanceArrayWritable
所以现在我有个问题。我想迭代arraywritable子类。
我试过以下方法:
把那行改成 for(VertexDistanceWritable distEntry : message.toArray())
它告诉我,对于每个不适用于类型object的对象(required:array或java.lang.iterable,found:object)。
把那行改成 for(VertexDistanceWritable distEntry : message.get() )
,这让我 error: incompatible types
-- required: VertexDistanceWritable, found: Writable
. 这是最奇怪的问题--vertexdistancewritable扩展了writable,这不是很好吗?
为vertexdistancewritable编写我自己的自定义“get\u foo()”函数,该函数以vertexdistancewritable[]的形式返回值。当然,值是私有的,根据文档除了get()之外没有getter函数,我已经遇到了一些问题
我只想要一种方法来迭代我的vertexdistancearraywritable类。这在hadoop中可能吗?一定是的,对吧?我应该可以迭代数组中的一堆元素,不是吗?这看起来像是相当糟糕的基本东西。
1条答案
按热度按时间wfsdck301#
经过30分钟的实验和搜索,我发现了一个线索。有点俗气,但似乎编译正确。基本上只是使用一个可写的,然后把它转换成我的自定义可写。
我还没有确认它是否工作正常,我会更新和确认我的答案时,我可以确保它的工作。
编辑:有效。可能需要一个复制构造函数,因为我有一个用于vertexdistancewritable的构造函数,但从未 checkout 它。