2013-10-08 2 views
1

Это мой код:Как перетасовать deque?

import java.util.ArrayDeque; 
import java.util.Collections; 
import java.util.Deque; 
import java.util.List; 

public class ArrayDequeDemo { 
    public static void main(String[] args) { 

     // create an empty array deque with an initial capacity 
     Deque<Integer> deque = new ArrayDeque<Integer>(8); 

     // use add() method to add elements in the deque 
     deque.add(15); 
     deque.add(30); 
     deque.add(20); 
     deque.add(18);   

     // let us print all the elements available in deque 
     for (Integer number : deque) { 
     System.out.println("Number = " + number); 
     } 

     //Collections.shuffle((List<?>) deque); 
     // getFirst() will retrieve element at first(head) position 
     int retval = deque.getFirst(); 
     System.out.println("Retrieved Element is = " + retval); 
    } 
} 

Я знаю, как тасовать List, но как я могу использовать Collections перетасовать Deque? Пожалуйста, ответьте кодом, поскольку я не полностью использую термины/теории Java, я все еще участвую.

ответ

4

Вы не можете использовать java.util.Collections для смешивания Deque; он работает только с коллекциями, которые реализуют List. Вы можете написать собственную процедуру воспроизведения в случайном порядке или вы можете сначала создать List, перемешайте, а затем скопировать результаты к Deque:

public static void main(String[] args) { 

    // create an empty array deque with an initial capacity 
    List<Integer> list = new ArrayList<Integer>(8); 

    // use add() method to add elements in the deque 
    list.add(15); 
    list.add(30); 
    list.add(20); 
    list.add(18);   

    // let us print all the elements available in deque 
    for (Integer number : list) { 
    System.out.println("Number = " + number); 
    } 

    Collections.shuffle(list); 
    Deque<Integer> deque = new ArrayDeque<Integer>(list); 
    // getFirst() will retrieve element at first(head) position 
    int retval = deque.getFirst(); 
    System.out.println("Retrieved Element is = " + retval); 
} 

Проблема с записи собственной процедуры воспроизведения в случайном порядке, конечно, является то, что Deque интерфейс не обеспечивает средства перемещения элементов вокруг.

+0

Спасибо! Я заберу это как ответ :) Быстрый вопрос, читая другие ответы, я вижу это: 'Обратите внимание, что Deque - это только интерфейс, чтобы Shuffle использовал класс, который также реализует List, тогда вы можете использовать Collections.shuffle (List)' Is This что вы сделали выше? – Ryan

+0

@ Ryan - Точно. Если вам нужен один конкретный тип коллекции, который реализует как «Список», так и «Deque», вы можете использовать «LinkedList». Обратите внимание, что массивные массивы имеют O (1) время доступа к случайным элементам, а 'LinkedList' - O (n). (Перетасовка «ArrayList» выполняется быстрее, чем перетасовка «LinkedList».) Однако для прямой итерации или для повторных операций в начале и/или конце «LinkedList» имеет такую ​​же хорошую (а иногда и лучшую) производительность по сравнению с массивом, основанные на коллекции. –

+0

Еще раз спасибо, хорошо отдохните! – Ryan

1

Collections.shuffle (List) принимает только List, поэтому для того, чтобы перетасовать Deque, вам нужно использовать реализацию LinkedList Deque. LinkedList реализует интерфейсы Deque и List. См. http://docs.oracle.com/javase/tutorial/collections/implementations/deque.html

public static void main(String[] args) { 

    LinkedList<Integer> list = new LinkedList<Integer>(); 

    // use add() method to add elements in the deque 
    list.add(15); 
    list.add(30); 
    list.add(20); 
    list.add(18); 

    // let us print all the elements available in deque 
    for (Integer number : list) { 
     System.out.println("Number = " + number); 
    } 

    Collections.shuffle(list); 
    int retval = list.getFirst(); 
    System.out.println("Retrieved Element is = " + retval); 
} 
+0

Спасибо, посмотрим ссылку, которую вы опубликовали. Я уже знал, как это сделать со списком, но часть deque меня озадачила. Добавили +1. – Ryan