Итерация общих коллекций в Java - PullRequest
0 голосов
/ 20 октября 2019

Я очень новичок в Java и изо всех сил пытаюсь понять дженерики, способы их использования и синтаксис для этого.

У меня есть следующий класс

class MyCustomArray<T>{

    private T[] myArray;

    // Default Constructor
    public ArraySet(){
        this.myArray= (T[]) new Object[10];
    }

    // Method to get array length
    public int getSize(){
        return this.myArray.length;
    }

    ... some random code

    // Method to iterate
    public void iterateSomehow(MyCustomArray<? extends T> collection){

        // doesn't work
        for(T obj: collection){...}

        // doesn't work
        for(int i=0; i< collection.size(); i++){
            T nextObj= collection[i];
        }

    }
}

Это для назначения класса, которое запрещает использование стандартных классов, таких как ArrayList. Я чувствую, что здесь что-то упущено фундаментальное , но не знаю что.

Мой подход неверен? Это просто синтаксис?

Еще немного контекста:

Моя непосредственная цель - проверить каждое значение в данном collection объекте как таковом (псевдокод, очевидно):

for( int i=0; i < collection.length; i++ ):
    value = collection[i];
    if (value == badValue):
       // whatever

Ответы [ 2 ]

3 голосов
/ 20 октября 2019

Только синтаксис может быть проиндексирован с помощью синтаксиса [], и только массивы или классы, реализующие Iterable, могут использоваться в правой части расширенного цикла for (for (T xxx : yyy)). Ваш класс не является массивом и не реализует Iterable, поэтому ни одна из ваших попыток не сработала.

Хотя ваш класс содержит массив - myArray. Вы можете просто повторить это. И то, и другое хорошо:

for(T obj: collection.myArray){...}
// or
for(int i=0; i< collection.getSize(); i++){
    T nextObj= collection.myArray[i];
}

Мне также кажется, что у вашего метода не должно быть параметра, и вместо этого он должен перебирать this (если это на самом деле требование к домашней работе, то он не можетпомочь):

for(T obj: myArray){...}

for(int i=0; i< getSize(); i++){
    T nextObj= myArray[i];
}
0 голосов
/ 20 октября 2019

Вы не можете перебирать коллекцию напрямую (потому что это просто объект), вы должны получить доступ к myArray. Вы также можете реализовать интерфейс Iterable, он позволяет вам что-то вроде этого

  for(T obj: collection){...}

https://www.geeksforgeeks.org/java-implementing-iterator-and-iterable-interface/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...