Java 协议缓冲区-can';t添加字符串列表

Java 协议缓冲区-can';t添加字符串列表,java,protocol-buffers,Java,Protocol Buffers,我有一个Java程序。我需要保存一些值,因此我执行了以下操作: Parameters.entryParameters.Builder parameters = Parameters.entryParameters.newBuilder(); parameters.setMaxNumberOfRules(maxNumberOfRules); parameters.setMaxPValue(maxPValue); parameters.setMaxR

我有一个Java程序。我需要保存一些值,因此我执行了以下操作:

Parameters.entryParameters.Builder parameters = Parameters.entryParameters.newBuilder();

        parameters.setMaxNumberOfRules(maxNumberOfRules);
        parameters.setMaxPValue(maxPValue);
        parameters.setMaxRuleLength(maxRuleLength);
        parameters.setMinimumSupport(minimumSupport);
for(int i = 0; i < genesOfPrimarySet.size(); i++) { 
                Parameters.entryParameters.primarySet.Builder primarySet =
                        Parameters.entryParameters.primarySet.newBuilder().setGenesOfPrimarySet(i, genesOfPrimarySet.get(i));
            }
这就是工作。在下一行中,我这样做了:

Parameters.entryParameters.Builder parameters = Parameters.entryParameters.newBuilder();

        parameters.setMaxNumberOfRules(maxNumberOfRules);
        parameters.setMaxPValue(maxPValue);
        parameters.setMaxRuleLength(maxRuleLength);
        parameters.setMinimumSupport(minimumSupport);
for(int i = 0; i < genesOfPrimarySet.size(); i++) { 
                Parameters.entryParameters.primarySet.Builder primarySet =
                        Parameters.entryParameters.primarySet.newBuilder().setGenesOfPrimarySet(i, genesOfPrimarySet.get(i));
            }

我不知道为什么,但在本例中它不起作用,当我将字符串更改为int32时,它就起作用了。

Protobuf遵循标准java列表契约:
setXXX()
方法替换给定位置的元素。因为最初列表的长度为空,所以会引发IndexOutOfBoundsException。要附加元素,您需要使用
addXXX()
方法:

Parameters.entryParameters.primarySet.Builder primarySet = 
    Parameters.entryParameters.primarySet.newBuilder();
for (int i = 0; i < genesOfPrimarySet.size(); i++) { 
    primarySet.addGenesOfPrimarySet(genesOfPrimarySet.get(i));
}
在这种情况下,您不需要为
primarySet
创建独立的生成器——您可以使用
entryParameters
Builder提供的生成器:

...
for (int i = 0; i < genesOfPrimarySet.size(); i++) {
  parameters.getGenesBuilder().addGenesOfPrimarySet(genesOfPrimarySet.get(i);
}
。。。
对于(int i=0;i