2016-02-28 2 views
0

у меня есть два типа для петель, 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(); 
} 

Are метод 1) и 2) логически то же или нет? Потому что 1) возвращает значение, которое я ожидаю, но метод 2) возвращает неправильное значение. Спасибо за помощь!

Реализация списка с различными методами получения.

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

'AbstractList '? Что такое подпись 'description.contains'? – Makoto

+1

Зачем расширять класс списка, когда вы можете просто создать 'ArrayList ' с самого начала? –

+0

Я честно говоря, не помню прямо сейчас, была причина, и я помню, что она хорошая, но сейчас я собираюсь в 30-х годах кодирования, и я не могу вспомнить. Я просто знаю, что мне пришлось расширять его и создавать собственные методы получения, которые мне нужны, потому что иначе я не мог найти значения FileType. – codeCompiler77

ответ

5

Если бы это было правильно реализация List, то они были бы логически то же самое (хотя они могут отличаться в сроки выполнения).

Если они дают различные результаты, то либо get(int) метод или метод iterator() не так, как ожидалось, то есть не возвращает элемент i -ю или не проходить через все элементы соответственно.

EDIT: после обновления вопроса проблема понятна - вы переопределяете метод get(int) (хотя он возвращает объект, но в коде, к которому он обращается как FileType - выглядит подозрительно). Но нет переопределения метода iterator(). Iterator, который возвращается iterator(), фактически используется во втором для цикла прозрачно компилятором. Если вы не переопределите код, он никогда не сможет работать.

+1

Я думаю, что это немного более тонко, чем это. Тот факт, что это список, который использует «Объект» в качестве своего типа поддержки, приводит меня к мысли, что происходит что-то еще. – Makoto

+1

+1. Важно также отметить, что второй будет поддерживать любую «коллекцию», позволяющую «FileList» быть изменен на «Set» или массив без каких-либо изменений в этом коде. – Obicere

+0

Извините, так что мне нужно сделать, чтобы исправить это? Внедрить 'Коллекции'? и создать перегруженный «итератор»? Каким должен быть мой итератор? @Makoto Я также удалил '', теперь это просто абстрактный список, и он отлично работает: S – codeCompiler77

0

У вас может быть несколько вещей, сплетенных здесь.

  • Вашего вшита класс также был итератор, когда все, что вы хотели сделать было перебрать вашу поддержку ArrayList.
  • Вы перезаписали get, что гарантированно даст вам результат, который вам нужен при его использовании, но не учитывает iterator().

В конечном счете, у вас не было причин распространять AbstractList. Вместо этого используйте только резервный список.

Чтобы сделать это, создайте поглотитель для него:

public ArrayList<FileType> getFileList() { 
    return fileList; 
} 

..., а затем использовать его в своей итерации:

for(FileType type : fileList.getFileList()) { 
    // logic here 
} 

Он бы тогда вести себя не по-другому к вашему get.