java - ArrayLists 更好的实践
问题描述
我用 Java 编写了 2 个方法。第二种方法对我来说看起来更干净,因为我来自 python 背景,但我认为它会比第一种慢,因为 indexOf() 也进行迭代?在这种情况下,有没有办法正确使用 for in 循环?另外,如果有更好的方法(没有 Streams),怎么做?
private ArrayList<MyObject> myObjects;
第一种方法:
private int findObject(String objectName) {
for(int i=0; i<this.myObjects.size(); i++) {
MyObject myObject = this.myObjects.get(i);
if(myObject.getName().equals(objectName)) return i;
}
return -1;
}
第二种方法:
private int findObject(String objectName) {
for(MyObject myObject: this.myObjects) {
if(myObject.getName().equals(objectName)) return this.myObjects.indexOf(myObject);
}
return -1;
}
解决方案
我认为它会比第一个慢,因为 indexOf() 也进行迭代?
你是对的。
有没有办法
for each
在这种情况下正确使用循环?
您可以使用for each
AND 索引变量。
private int findObject(String objectName) {
int i = 0;
for (MyObject myObject: this.myObjects) {
if (myObject.getName().equals(objectName)) return i;
i++;
}
return -1;
}
myObjects.get(i)
如果是昂贵的操作(例如在LinkedList
where get(n)
is 上O(N)
)或者如果它不可实现(例如,如果您正在迭代 a ),这将是一个很好的解决方案Stream
。
您还可以使用ListIterator
提供的myObjects
方法,该方法返回ListIterator
; 有关示例,请参见@Andy Turner 的答案。(它不适用于典型Set
或Map
班级。)
推荐阅读
- kubernetes - 如何展平从 configMapGenerator 生成的 configMap?
- java - 在 Java 中填充多维数组
- javascript - 异步调用链,其中最后一个调用比较第一个调用的内容
- python - 获取以给定字符串开头的列中的唯一项
- flask - 在烧瓶应用程序中导入模块的问题
- jupyter-notebook - 如何获取 IPython 或 Jupyter 笔记本中最近执行的“执行计数”?
- r - 基于某个值的子集数据框
- python - 张量的 tf.print 问题(无法打印单个值)
- umbraco - Umbraco 8 - 隐藏成员组
- javascript - 如何配置 socket.io 来监听客户端