Java List.set() 改变列表大小。为什么?

标签 java android list

我正在编写 android 应用程序,它在 1 个图中绘制 4 个图形。图形数据存储在对象 GraphViewData(x,y) 中。我还有包含 4 个 GraphVieData 对象的列表。

我想让用户能够关闭/打开某些图表。

我尝试编写 myList.set(index, null) 来隐藏图形,然后编写 myList.set(index, myObject) 以再次显示它,但每次列表大小都在变化。所以我遇到了 IndexOutOfBound 异常。

请告诉我为什么列表大小会发生变化?这是 List.set() 的描述:

Replaces the element at the specified location in this List with the specified object. This operation does not change the size of the List.

代码:

public void removeSerie(int id){
    graphSeries.set(id, null);
    Log.d("CurrentListSize: ", graphSeries.size() + "");
}
public void addSerie(GraphViewData series, int id){
    graphSeries.set(id, series);
}

最佳答案

List.set(int, T) 的 javadoc 在 Java 之间存在差异和 Android .这令人担忧,但您应该按以下方式解决它:

  • Oracle 版本的 javadoc 是 Java 的最终版本。 List 实现允许更改集合中的列表大小。

  • Android 版本的 javadoc 应被视为不正确作为 Java 的来源。您可能会争辩说它对 Android 来说是正确的,但是如果您处理的代码不是专门为 Android 编写的,那并没有多大帮助。 (例如,为 Java 编写然后为 Android 编译的代码。)

  • Java 和 Android 中的标准 List 类不会执行此操作。 (检查源代码以确保万无一失,但如果其中任何一个在没有 javadoc 说明的情况下这样做,我会感到非常惊讶。)

  • 自定义/第 3 方 List可以执行此操作,并且仍然遵循 Java List 约定(尽管可以说不是Android 合约)。

  • 不保证自定义/第 3 方 List 类将遵循任一契约(Contract)。这使整个论点变得毫无意义……除非您可以说服相关作者/供应商更改相关列表类别。 (祝你好运,因为它可能会破坏其他人的代码!!)


那你该怎么办?我推荐:

  • 如果您希望能够使用 set 执行此操作,请确保您使用的是支持它的列表类。必要时检查列表类的代码。

  • 否则,请更改您的算法。

关于Java List.set() 改变列表大小。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137227/

相关文章:

java - 在链表中查找大写字母并返回包含找到的元素的新链表?

list - 方案 - 追加到列表的末尾

list - 如何更新tensorflow中优化器需要更新的变量列表?

java - AWS S3 设置对象生命周期,同时生成用于上传的预签名 uri

android - 在 64 位 Ubuntu 12.04 : error while loading shared libraries: libc++. 上运行 aapt so: No such file or directory

android - 自定义可扩展 ListView 添加按钮

android - 如何知道任何媒体文件的持续时间

java - 我想用jsp将随机数据添加到html中的表中

java - Apache POI 无法从 Excel 单元格中正确读取秒数

java - JSON 对象扁平化为 CSV 一行