不同类型的for循环

时间:2016-02-28 19:41:41

标签: java for-loop

我有两种类型的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;
}

2 个答案:

答案 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的行为没有区别。