2

我有一个作为其成员之一的列表的 protobuf

我想替换此列表中的一个项目。

我试图删除一个项目i并在同一位置添加另一个项目i

List<Venues.Category> categoryList = builder.getCategoryList();

    categoryList.remove(i);

但我得到一个不受支持的错误

java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableList.remove(Collections.java:1317)

如何执行替换?

4

4 回答 4

9

我最终克隆了列表,修改了克隆列表并将其替换为旧列表。

List<Venues.Category> clone = categoryList.stream().collect(Collectors.toList());
                clone.remove(i);
                clone.add(i, modifyCategory(category, countryAbbr, gasStationConfig));

                builder.clearCategory();
                builder.addAllCategory(clone);
于 2016-09-27T10:26:20.107 回答
5

解决方案之一是创建一个新的可修改列表来包装旧列表 - 我的意思是将它传递给例如 new 的构造函数ArrayList()

List<T> modifiable = new ArrayList<T>(unmodifiable);

从现在开始,您应该能够删除和添加元素。

于 2016-09-27T10:12:17.847 回答
1

如果要更新 protobuff 构建器列表,可以通过以下方式实现:

      //Considering builder is your Category list builder.
    List<Venues.Category> categoryList = builder.getCategoryList(); // Previous list.

        builder.setCategory(1, categoryBuilder.build()); //categoryBuilder is your object builder which you want to replace at first location.
// Hope you will get setCategory function by protobuffer, or something like that. because it's created by protobuffer compilation.

        List<Venues.Category> updatedCategoryList = builder.getCategoryList();
    //Your updated list with new object replaced at 1.
于 2016-09-27T10:31:53.603 回答
1

如果您的 List 来自数组,它将抛出java.lang.UnsupportedOperationException

/*Example*/
String[] strArray = {"a","b","c","d"};

List<String> strList = Arrays.asList(strArray);

strList.remove(0); // throw exception

因为原始数组和列表是链接的。

列表的大小是固定大小的,更改将对两者都有影响。

add()remove()无法完成。

于 2016-09-27T10:27:50.340 回答