Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Циклическая очередь


Автор: mulya 6.7.2006, 12:25
Мне нужна циклическая модификация очереди, то есть очередь по которой можно передвигаться используя метод Next до бесконечности. Проблема в том что я не знаю есть ли в Java стандартный класс подходящий моим запросам, может кто знает, а пока пользуюсь своим, но не радует. Заранее спасибо.
 

Автор: Bulat 6.7.2006, 12:39
mulya, а можешь поподробнее выложить проблему? 

Автор: mulya 6.7.2006, 13:02
Даже не знаю, что ещё написать. Вобщем мне нужен стандартная реализация Collection (нечто вроде Set), только с одной дополнительной фишкой, метод next(или подобный) должен выполняться всегда, то есть доходя до последнего элемента коллекции он должен переходить на первый, этим я и подразумеваю "цикличность". 

Автор: Bulat 6.7.2006, 13:18
mulya, бесконечный цикл. Может есть что-то что само переходит на первый элемент после последнего по умолчанию, я не знаю smile . Но можно через иф перебрасывать на первый элемент использую методы типа afterlast, first и т.п. Конкретной реализации не знаю, не приходилось еще с таким сталкиваться, щас модераторы откликнуться, они-то точно все выложут, помогут. 

Автор: mulya 6.7.2006, 14:19
Моя реализация этой задумки как раз и выполняет проверку последнего элемента и переходит на первый, но дело в том что для меня очень важна скорость, по этому я ищу стандартную реализацию. На СИ для таких вещей использовал структуры, одним из элементов которой являлся указатель на объект данной структуры, то есть, с указателями это сделать "как два пальца", но в Java же нет указателей, ведь так? 

Автор: Bulat 6.7.2006, 14:46
mulya, но в ява для коллекций есть методы типа last, first и т.п. Попробуй с ними помудрить, не зряж они были придуманы smile  

Автор: chief39 6.7.2006, 14:55
Сделай обёртку над какой-либо Коллекцией.

Получаешь итератор обёртки -> он получает и содержит итератор коллекции.
next() проверяет коллекцию на hasnext() - если нету - заново получить у коллекции итератор и сохранить его в итераторе обёртки. Можешь унаследовать  какую-то из коллекций, закрыть доступ к стандартному итератору и "открыть для паблик" свой. А он будет работать со стандартным, как я уже описал 

Автор: last 10.7.2006, 07:37
Примерная реализация:

nextIndex() и previousIndex() нереализовывал ибо лень  smile 
кроме того понятие "индекс" плохо вписываеться в концепцию циклической очереди

при желании их можно легко реализовать также как и next(), previous(), только не объект возвращать, а его индекс

Код

package test.util;

import java.util.*;
//import org.junit.*;

public class CircleList<E> extends LinkedList<E> {
    
    private final class CircleIterator implements ListIterator<E> {
        private ListIterator<E> i = CircleList.super.listIterator();
        
        public boolean hasNext() {
            if (CircleList.this.size() != 0)
                return true;
            return false;
        }
        
        public boolean hasPrevious() {
            return hasNext();
        }
        
        public void remove() {
            i.remove();
        }
        
        public E previous() {
            if (i.hasPrevious())
                return i.previous();
            i = CircleList.super.listIterator();
            while (i.hasNext()) 
                next(); //reset iterator and goto to end of list
            if (i.hasPrevious()) 
                return i.previous();            
            throw new NoSuchElementException();
        }
        
        public E next() {            
            if (i.hasNext()) 
                return i.next();           
            i = CircleList.super.listIterator(); //reset iterator and goto to begin of list
            if (i.hasNext()) 
                return i.next();            
            throw new NoSuchElementException();                
        }
        
        public void set(E o) {
            i.set(o);
        }
        
        public void add(E o) {
            i.add(o);
        }
        
        /**
         * Unsupported operation
         */
        public int nextIndex() {
            throw new UnsupportedOperationException();            
        }
        
        /**
         * Unsupported operation
         */
        public int previousIndex() {
            throw new UnsupportedOperationException();
        }
    }
    
    public CircleList() {
    }
    
    public CircleList(Collection<? extends E> c) {
        super(c);
    }
    
    public Iterator<E> iterator() {
        return listIterator();        
    }
    
    public ListIterator<E> listIterator() {
        return new CircleIterator();
    }
    
    /*
     * ФЕУФПЧЩК НЕФПД, ДПМЦЕО ОБРЕЮБФБФШ "absdabc" "cbadcbadcb"
     */
     //  @Test
    public static  void main(String [] args) {
        String [] s = {"a","b","c","d"};
        String test = "";
        CircleList<String> circleList = new CircleList<String>(Arrays.asList(s));        
        ListIterator<String> iter = circleList.listIterator();
        for (int i = 0 ; i < 7; i++) {
            test += iter.next();            
        }                
        //Assert.assertTrue("Error in CircleList implementation",test.equals("abcdabc"));
        System.out.println(test);
        
        test = "";
        for (int i = 0 ; i < 10; i++) {
            test += iter.previous();            
        }
        //Assert.assertTrue("Error in CircleList implementation",test.equals("cbadcbadcb"));
        System.out.println(test);    
    }

 

Автор: mulya 10.7.2006, 08:28
Спасибо 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)