2014-09-23 5 views
-2

То, что я пытаюсь достичь, - это вернуть определенный трек, когда соответствующий индекс равен номеру дорожки.Поиск индекса в 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 не может быть разыменован.

+1

Как вы можете использовать двойной равный оператор на примитиве и объекте? Это катастрофическая ошибка компиляции. – ares

+0

Вы вызываете 'tracksN.size()', который возвращает 'int'. Это вызывает ошибку времени компиляции (вы не можете вызвать метод на 'int'). Скорее всего, это 'trackN.get (i) .getTrack()' - или любой метод из класса 'Track' возвращает значение целочисленного трека. – Jared

+1

Почему вам не нужен отдельный метод для получения объекта из 'ArrayList' по индексу. В 'ArrayList' уже есть' get (int index) '. –

ответ

0

Это неправильно

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

Это должно быть

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

tracksN является ArrayList нет такого метода .size().get(i). tracksN.get(i) вернет Track, вы должны получить поле для его сравнения.

Также взгляните на свой метод.

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

} 

Вы должны исправить все эти проблемы.

Вы можете получить дорожки по индексу легко с помощью get(index)

Читайте о List в Java

+0

Я попробовал это тот путь, и я получил несравненным: Track и Int – rhapshie

+0

@Downvoter должны иметь мужество, чтобы положить комментарий по крайней мере. –

+0

Я не знаю, кто довел вас до того, как я это сделал, но ваш ответ полностью неполный. Довольно ясно, что он пытается сделать, и вы даже не приблизились к этому. – Jared

2

Я не понимаю, почему вы итерацию (когда вам нужно i-й трек). Вы можете просто:

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

'Я не понимаю, почему вы повторяете 'весь код не имеет логики, так что ... неудивительно. – Dici

0

посмотреть! вы объявляете метод как:

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

так что возвращаемое значение должно быть экземпляром дорожки или нулевого значения. Но здесь, в цикле, вы возвращаете значение int. вот почему!

+0

Забавно, что каждый ответ указывает на другую огромную ошибку в этом коде. – Dici

+0

yup! основная ошибка! @Dici –

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 из Track объектов для предполагаемого индекса:

public 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 объекты, то внутренняя varibale int track должна быть private, и вы должны предоставить методы getter и setter, но если вы думаете, что когда-то создается объект Track, он никогда не будет изменен (т. е. является неизменным), тогда вы должны пойти с объявлением 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; 
} 
+0

stackOverFlow не предоставляет код в полном объеме. Но поможет OP снова подумать, объяснив вещи. –

+0

@RuchiraGayanRanaweera ОК, сначала вы хотите, чтобы вы отметили это как плохой вопрос для этого (это, вероятно, есть). Во-вторых, ваш ответ по-прежнему не помогает OP вообще. Я представил комментарий по вопросу, который объяснил ошибку времени компиляции, и вы предложили мне предоставить решение, которое я сделал. Кроме того, я подробно остановился на том, чтобы помочь OP писать хороший Java-код (через объявления public vs. private vs. method), поэтому, на мой взгляд, я помогаю OP стать лучшим программистом. – Jared

Смежные вопросы