помогите разобраться с итератором

 
 
 
Сообщения:30
всем привет. реализовываю свой класс таблицы основанной на массиве ArrayList'a. все методы реализовал кроме методов Итератора. не получается реализовать.

    private ArrayList<E>[] hashTable;

Изменен:04 июл 2016 03:22
 
 
Сообщения:154
Не очень эффективно, но вроде работает:
private class MyHashTablesIterator implements Iterator<E>
{
   @Override
   public boolean hasNext()
   {
      boolean result = false;

      if(bucketPosition >= hashTable.length)
      {
         return result;
      }

      while(bucketPosition < hashTable.length - 1)
      {
         if(hashTable[bucketPosition] == null)
         {
            bucketPosition++;
         }
         else
         {
            if(listIterator == null)
            {
               listIterator = hashTable[bucketPosition].iterator();
            }

            result = listIterator.hasNext();
            if(result == true)
            {
               break;
            }
            else
            {
               listIterator = null;
               bucketPosition++;
            }
         }
      }

      return result;
   }

   @Override
   public E next()
   {
      return listIterator.next();
   }

   private int bucketPosition;
   private Iterator<E> listIterator;
}
Изменен:25 июн 2016 23:23
 
 
Сообщения:30
vps:
Не очень эффективно, но вроде работает:
private class MyHashTablesIterator implements Iterator<E>
{
   @Override
   public boolean hasNext()
   {
      boolean result = false;

      if(bucketPosition >= hashTable.length)
      {
         return result;
      }

      while(bucketPosition < hashTable.length - 1)
      {
         if(hashTable[bucketPosition] == null)
         {
            bucketPosition++;
         }
         else
         {
            if(listIterator == null)
            {
               listIterator = hashTable[bucketPosition].iterator();
            }

            result = listIterator.hasNext();
            if(result == true)
            {
               break;
            }
            else
            {
               listIterator = null;
               bucketPosition++;
            }
         }
      }

      return result;
   }

   @Override
   public E next()
   {
      return listIterator.next();
   }

   private int bucketPosition;
   private Iterator<E> listIterator;
}

вопрос такой возник - итератор будет null'овый когда коллекция null? или в каких-то еще случаях?
P.S. и кстати вроде не работает) проверял на таких строках - "ppp", "tok", "kot".
Изменен:28 июн 2016 13:57
 
 
Сообщения:154
Проверял на типе Integer. Если правильно помню (исходников уже нет), то добавлял 1, 2, 3, 300, 600. Первые 3 числа уходили в корзины с номерами 1, 2, 3. Числа 300 и 600 вроде как заносились в корзину 0. Вывод через итератор был: 300, 600, 1, 2, 3.

Не совсем понял Ваш вопрос. У Вас вроде как при создании основного класса создавался фиксированный массив корзин какого-то размера. Соответственно итератор пробегается по этим корзинам и смотрит, есть ли в нём список. Если нет, то бежит далее до последнего элемента.

P/S: у Вас куда-то делась реализация основного класса.
Изменен:28 июн 2016 15:53
 
 
Сообщения:30
vps:
Проверял на типе Integer. Если правильно помню (исходников уже нет), то добавлял 1, 2, 3, 300, 600. Первые 3 числа уходили в корзины с номерами 1, 2, 3. Числа 300 и 600 вроде как заносились в корзину 0. Вывод через итератор был: 300, 600, 1, 2, 3.

Не совсем понял Ваш вопрос. У Вас вроде как при создании основного класса создавался фиксированный массив корзин какого-то размера. Соответственно итератор пробегается по этим корзинам и смотрит, есть ли в нём список. Если нет, то бежит далее до последнего элемента.

P/S: у Вас куда-то делась реализация основного класса.


проверял на таком примере
ht1.add("ppp");
ht1.add("tok");
ht1.add("kot");
Изменен:28 июн 2016 16:53
 
 
Сообщения:154
Да, есть ошибка. Вот, что значит ночью делать. :)
Вот в этом куске кода
while (bucketPosition < hashTable.length - 1)
надо оставить
while (bucketPosition < hashTable.length)


P/S: в моём коде переменные int bucketPosition и Iterator<E> listIterator являются членами класса MyHashTablesIterator.
Изменен:28 июн 2016 16:24
 
 
Сообщения:30
объясни плиз про итератор null. и почему все-таки не -1 а просто длина?
Изменен:28 июн 2016 16:32
 
 
Сообщения:154
Я не могу объяснить, т.к. не понимаю вопроса.
 
 
Сообщения:30
вот эта строка
 listIterator == null

почему итератор может быть null
 
 
Сообщения:154
В каждой корзине у Вас свой объект типа ArrayList, а у каждого объекта свой итератор. Поэтому при переходе на новую корзину, обнуляется предыдущий итератор и создаётся новый.
 
 
Сообщения:30
vps:
В каждой корзине у Вас свой объект типа ArrayList, а у каждого объекта свой итератор. Поэтому при переходе на новую корзину, обнуляется предыдущий итератор и создаётся новый.


пытаюсь упростить итератор, но застревает на предпоследнем элементе вроде
Изменен:04 июл 2016 03:23
 
 
Сообщения:154
Вы уверены, что метод "hasNext()" делает то, что надо?
 
 
Сообщения:30
vps:
Вы уверены, что метод "hasNext()" делает то, что надо?


вот так наверное правильнее будет
        @Override
        public boolean hasNext() {

            int lastPosition = hashTable[bucketPosition].size();
            int lastBucket = hashTable.length - 1;
            if (bucketPosition < lastBucket && indexPosition < lastPosition) {
                return true;
            }
            return false;
        }

итератор проверяю на строках. добавил следующие строки - pop, kok, ppp, lol, tot, tok, kot
дошел только до "tok", но уже без ошибок
а еще вторую строку пропустил "kok"
Изменен:30 июн 2016 14:03
 
 
Сообщения:30
располагаются по букетам объекты так
0 - pop
0 - kok
1 - ppp
2 - lol
3 - tot
4 - tok
4 - kot
пропускает "kok" и "kot"
то есть там где больше одного элемента берет только первый и потом переходит на следующий уровень
 
 
Сообщения:154
Или Вы выложили не полный код, или переменная "indexPosition" лишняя, то есть ей нигде не присваивается значение.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет