在ArrayList中查找索引

时间:2014-09-23 10:29:55

标签: java arraylist

我想要实现的是当相应的索引等于曲目编号时返回某个曲目。

private ArrayList<Track> tracksN;

public Track getTrack(int index)
{
    for(int i = 0; i < tracksN.size(); i++)
    {
        if (tracksN.size().get(i)==index)
        {
            return i;
        }
    }
    return null;
}

但我收到错误消息:int无法解除引用。

4 个答案:

答案 0 :(得分:2)

我不明白为什么要迭代(当你需要i曲目时)。你可以这样做:

public Track getTrack(int index) {
    if (index >= 0 && index < tracksN.size()) {
       return tracksN.get(index); 
    }
    return null;
}

答案 1 :(得分:0)

这是错误的

if (tracksN.size().get(i)==index)

应该是

 if (tracksN.get(i)==index)

tracksNArrayList,没有这样的方法.size().get(i)tracksN.get(i)将返回Track您应该从中获取字段进行比较。

另请查看您的方法。

public Track getTrack(int index){ // you should return a Track not int

}

你必须纠正所有这些问题。

您可以使用get(index)

轻松获取索引

了解Java

中的List

答案 2 :(得分:0)

看!您将方法声明为:

public Track getTrack(int index)
{
/*..*/
}

因此返回值必须是Track或null值的实例。但是在循环中你返回一个int值。这就是为什么!

答案 3 :(得分:0)

看,我假设你有一个整数值为Track的班级track,如下所示:

public class Track{
    public final int track;

    public Track(final int track){
        this.track = track;
    }

    public int getTrack(){
        // this method is unnecessary if you declare
        //    track as public final
        return track;
    }
}

现在,您的方法应该在ArrayList Trackpublic Track getTrack(final int track){ for(final Track thisTrack: tracks){ if(thisTrack.getTrack() == track) return thisTrack; } // the track wasn't found, return null return null; } 个对象中搜索预期的索引:

Track

所有这些都假定跟踪索引是唯一的 - 否则您将返回放入ArrayList的第一个public final对象,该对象符合您的搜索条件。

...更好的是,如果您对变量track使用public Track getTrack(final int track){ for(final Track thisTrack: tracks){ if(thisTrack.track == track) return thisTrack; } // the track wasn't found, return null return null; } 标识,那么您只需执行以下操作:

Track

如果要回收int track个对象,那么内部varibale Track应该是私有的,你应该提供getter和setter方法,但如果你认为public final int track对象是创建它永远不会被更改(即是不可变的),那么你应该使用equals声明,以便访问变量(永远不会改变并且是原始的)并不需要方法调用。

您还可以使用其他选项,我强烈反对,但您可以覆盖Object中的indexOf方法,并使用ArrayList中的public class Track{ public final int track; public Track(final int track){ this.track = track; } public int getTrack(){ // this method is unnecessary if you declare // track as public final return track; } @Override public boolean equals(final Object o){ // make sure this object is a Track object if(o instanceof Track){ final Track t = (Track)o; // if the two track indices equal each other then they are // same track object return t.track == track; } // this Object isn't a Track object and so definitely isn't equal to // this Track object return false; } 方法找到你的对象:

Track

然后在你的搜索中你可以创建一个新的public Track getTrack(final int track){ // create a new Track object to search for final Track testTrack = new Track(track); // get the index of this Track object (if isn't in the list, this will // return -1) final int index = tracks.indexOf(testTrack); // if index is valid return the track at the given index, else // return null (the Track doesn't exist). return index >= 0 ? tracks.get(index) : null; } 对象(这很糟糕,因为它为堆增加了不必要的内存,以后需要进行垃圾收集 - 将原语添加到堆栈中,这就是为什么上面是首选 - 一旦方法返回,立即回收添加到堆栈中的东西:

{{1}}