0

我有这个类:

public class Stripe implements WritableComparable<Stripe>{
    private List<Term> occorrenze = new ArrayList<Term>();

    public Stripe(){}

    @Override
    public void readFields(DataInput in) throws IOException {

    }
}


public class Term implements WritableComparable<Term> {

    private Text key;
    private IntWritable frequency;

    @Override
    public void readFields(DataInput in) throws IOException {
        this.key.readFields(in);
        this.frequency.readFields(in);
    }

Stripe 是一个术语列表(Text 和 intWritable 对)。如何设置方法“readField”以从 DataInput 读取复杂类型 Stripe?

4

2 回答 2

1

要序列化列表,您需要写出列表的长度,然后是元素本身。Stripe 的一个简单的 readFields / write 方法对可以是:

@Override
public void readFields(DataInput in) throws IOException {
    occorrenze.clear();
    int cnt = in.readInt();
    for (int x = 0; x < cnt; x++) {
        Term term = new Term();
        term.readFields(in);
        occorrence.add(term);
    }
}

@Override
public void write(DataOutput out) throws IOException {
    out.writeInt(occorrenze.size());
    for (Term term : occorrenze) {
        term.write(out);
    }
}

您可以通过使用 VInt 而不是 int 并使用术语池来提高效率,这些术语可以重复用于在readFields方法中节省对象创建/垃圾收集

于 2013-06-03T20:46:56.260 回答
0

您可以使用 ArrayWritable ,它是相同类型的可写列表。

于 2013-06-03T16:47:50.650 回答