2016-12-11 4 views
0

Хорошо, так что было легко реализовать круговую очередь с массивом.Реализация круговой очереди с использованием ArrayList

Здесь у меня есть код, который пытается реализовать круговую очередь, используя arraylist. проблема в том, что, хотя я реализовал свои методы deque и enque, это не работает с моим arraylist (однако это работает с обычным массивом).

В отличие от массива, если я использую этот код на своем массиве, это как представляется, удаление и добавление неправильно в различных positionns

import java.util.*; 

public class People { 

    private final int DEFAULT_CAPACITY = 100; 
    private int front, rear, count; 
    private ArrayList<thePeople> people; 
    private int theMaxCapacity; 

    //----------------------------------------------------------------- 
    // Creates an empty queue using the specified capacity. 
    //----------------------------------------------------------------- 
    public People(int initialCapacity) { 
     front = rear = count = 0; 
     people = new ArrayList<thePeople>(Collections.nCopies(5, (thePeople) null)); 

    } 

    //----------------------------------------------------------------- 
    // Adds the specified element to the rear of the queue, expanding 
    // the capacity of the queue array if necessary. 
    //----------------------------------------------------------------- 
    public void enque(thePeople element) { 
     if (this.isFull()) { 
      System.out.println("Queue Full"); 

      System.exit(1); 
     } else { 
      people.set(rear, element); 
      rear = rear + 1; 
      if (rear == people.size()) { 
       rear = 0; 
      } 
      count++; 
     } 
    } 

    //----------------------------------------------------------------- 
    // Removes the element at the front of the queue and returns a 
    // reference to it. Throws an EmptyCollectionException if the 
    // queue is empty. 
    //----------------------------------------------------------------- 
    public thePeople dequeue() { 
     if (isEmpty()) { 
      System.out.println("Empty Queue"); 
     } 

     thePeople result = people.get(front); 
     people.set(front, null); 

     front = (front + 1) % people.size(); 

     count--; 

     return result; 
    } 

    //----------------------------------------------------------------- 
    // Returns true if this queue is empty and false otherwise. 
    //----------------------------------------------------------------- 
    public boolean isEmpty() { 
     return (count == 0); 
    } 

    //----------------------------------------------------------------- 
    // Returns the number of elements currently in this queue. 
    //----------------------------------------------------------------- 
    public int size() { 
     return count; 
    } 

    public boolean isFull() { 

     return count == people.size(); 
    } 

    public void mySimulation() { 
     Random rand1 = new Random(); 
     thePeople theM = null; 

     if (this.isFull()) { 
      this.people.remove(0); 
      System.out.println("Enqueueing..."); 
      this.enque(people.get(rand1.nextInt(people.size()))); 
      thePeople r1 = people.get(rear - 1); 
      System.out.println(people.toString()); 
      System.out.println(r1); 
      for (int e = 0; e < people.size(); e++) { 
       if (people.get(e) instanceof thePeople) { 
        System.out.println("G"); 
       } else { 
        System.out.println("D"); 
       } 
      } 

     } 

    } 

    //----------------------------------------------------------------- 
    // Returns a string representation of this queue. 
    //----------------------------------------------------------------- 
    @Override 
    public String toString() { 
     String result = ""; 
     int scan = 0; 

     while (scan < count) { 
      if (people.get(scan) != null) { 
       result += people.get(scan).toString() + "\n"; 
      } 
      scan++; 
     } 

     return result; 

    } 

    public static void main(String[] args) { 
     People Q1 = new People(25); 
     thePeople call1 = new thePeople("John King", "001 456 789"); 
     thePeople call2 = new thePeople("Michael Fish", "789 654 321"); 

     Q1.enque(call1); 
     Q1.enque(call2); 

     System.out.println(Q1.toString()); 
     ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2)); 
     Random rand = new Random(); 
     for (int z = 0; z <= 4; z++) { 
      Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size()))); 

     } 
     System.out.println(Q1.toString()); 

    } 

} 

мой вопрос заключается в том, что, как я могу изменить enque и DEQUE методы работы с araylist (круговой очереди ArrayList)?

+1

Основная идея использования arraylist для реализации круговой очереди нарушена. Если это школьное задание, это глупо, и мне жаль, что вы должны это сделать. Если это реальное приложение, используйте 'ArrayDeque'. – Gene

ответ

1

Я внесли некоторые изменения в ваш код, если это вам поможет.

import java.util.*; 

public class People { 

    private final int DEFAULT_CAPACITY = 100; 
    private int front, rear, count; 
    private ArrayList<thePeople> people; 
    private int theMaxCapacity; 

    //----------------------------------------------------------------- 
    // Creates an empty queue using the specified capacity. 
    //----------------------------------------------------------------- 
    public People(int initialCapacity) { 
     front = rear = count = 0; 
     people = new ArrayList<thePeople>(); 

    } 

    //----------------------------------------------------------------- 
    // Adds the specified element to the rear of the queue, expanding 
    // the capacity of the queue array if necessary. 
    //----------------------------------------------------------------- 
    public void enque(thePeople element) { 
     if (this.isFull()) { 
      System.out.println("Queue Full"); 
      System.exit(1); 
     } else { 
      people.add(element);   
     } 
    } 

    //----------------------------------------------------------------- 
    // Removes the element at the front of the queue and returns a 
    // reference to it. Throws an EmptyCollectionException if the 
    // queue is empty. 
    //----------------------------------------------------------------- 
    public thePeople dequeue() { 
     if (isEmpty()) { 
      System.out.println("Empty Queue"); 
     } 

     thePeople result = people.get(0); 
     people.remove(0);      

     return result; 
    } 

    //----------------------------------------------------------------- 
    // Returns true if this queue is empty and false otherwise. 
    //----------------------------------------------------------------- 
    public boolean isEmpty() { 
     return (people.size() == 0); 
    } 

    //----------------------------------------------------------------- 
    // Returns the number of elements currently in this queue. 
    //----------------------------------------------------------------- 
    public int size() { 
     return people.size(); 
    } 

    public boolean isFull() { 

     return people.size() == DEFAULT_CAPACITY; 
    } 

    public void mySimulation() { 
     Random rand1 = new Random(); 
     thePeople theM = null; 

     if (this.isFull()) { 
      this.people.remove(0); 
      System.out.println("Enqueueing..."); 
      this.enque(people.get(rand1.nextInt(people.size()))); 
      thePeople r1 = people.get(rear - 1); 
      System.out.println(people.toString()); 
      System.out.println(r1); 
      for (int e = 0; e < people.size(); e++) { 
       if (people.get(e) instanceof thePeople) { 
        System.out.println("G"); 
       } else { 
        System.out.println("D"); 
       } 
      } 

     } 

    } 

    //----------------------------------------------------------------- 
    // Returns a string representation of this queue. 
    //----------------------------------------------------------------- 
    @Override 
    public String toString() { 
     String result = ""; 
     int scan = 0; 

     while (scan < count) { 
      if (people.get(scan) != null) { 
       result += people.get(scan).toString() + "\n"; 
      } 
      scan++; 
     } 

     return result; 

    } 

    public static void main(String[] args) { 
     People Q1 = new People(25); 
     thePeople call1 = new thePeople("John King", "001 456 789"); 
     thePeople call2 = new thePeople("Michael Fish", "789 654 321"); 

     Q1.enque(call1); 
     Q1.enque(call2); 

     System.out.println(Q1.toString()); 
     ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2)); 
     Random rand = new Random(); 
     for (int z = 0; z <= 4; z++) { 
      Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size()))); 

     } 
     System.out.println(Q1.toString()); 

    } 

} 
+1

Я думаю, что это должно работать, возможно ли это потому, что я хотел для этой части people.add (element); и то же самое для deque не использовать вспомогательный метод, например, код, который часть ...? – blueGOLD

+1

Я отредактировал ответ, забыл удалить элемент при декукации. – Shay

+1

Этот ответ одобрен, но только он не заботится об обертывании, потому что я «реализую круговую очередь с использованием массива», например, добавляет задний = (задний + 1)% queue.length; и фронт = (фронт + 1)% queue.length; .....? – blueGOLD

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