我有两种类型的for循环,fileList
在这种情况下只是一个扩展AbstractList<Object>
的自定义类
1)用循环迭代索引:
public String getExtensionByDescription(String description)
{
for (int i = 0; i < fileList.size(); i++)
if (description.contains(fileList.get(i).getDescription()))
return fileList.get(i).getExtension();
}
2)对于按列表中的项目循环迭代:
public String getExtensionByDescription(String description)
{
for (FileType obj : fileList)
if (description.contains(obj.getDescription()))
return obj.getExtension();
}
方法1)和2)逻辑上是相同还是否?因为1)返回我期望的值,但方法2)返回错误的值。谢谢你的帮助!
使用各种其他get方法实现list。
public class FileList extends AbstractList<Object>
{
private ArrayList<FileType> fileList;
public FileList()
{
fileList = new ArrayList<FileType>();
}
public void add(String search, String type, String extension, String description, String htmlicon)
{
FileType data = new FileType(fileList.size(), search, type, extension, description, htmlicon);
if (!fileList.contains(data))
{
fileList.add(data);
}
}
@Override
public Object get(int index)
{
return fileList.toArray()[index];
}
,另一个类是
public FileType(int index, String search, String type, String extension, String description, String icon)
功能:
public String getDescription()
{
return description;
}
答案 0 :(得分:5)
如果它是List
的正确实现,那么它们在逻辑上是相同的(尽管它们在性能方面可能不同)。
如果他们给出不同的结果,那么get(int)
方法或iterator()
方法都不会按预期行事,即不会返回i
- 元素或不#&# 39; t分别遍历所有元素。
get(int)
方法(尽管它返回了对象但在代码中它作为FileType访问 - 看起来很可疑)。但是没有覆盖iterator()
方法。 Iterator
返回的iterator()
实际上是由编译器透明地在第二个for循环中使用的。除非你覆盖代码,否则永远不会有效。
答案 1 :(得分:0)
你可能会在这里混淆一些事情。
ArrayList
时。get
,保证在使用时提供您想要的结果,但不考虑iterator()
。最终,你没有理由延长AbstractList
。只需使用支持列表。
为此,请为其创建一个getter:
public ArrayList<FileType> getFileList() {
return fileList;
}
...然后在迭代中使用它:
for(FileType type : fileList.getFileList()) {
// logic here
}
然后它与您的get
的行为没有区别。