Java 我怎样洗牌?
这是我的代码:Java 我怎样洗牌?,java,shuffle,deque,Java,Shuffle,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 capacit
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);
}
}
import java.util.ArrayDeque;
导入java.util.Collections;
导入java.util.Deque;
导入java.util.List;
公共类ArrayDequeDemo{
公共静态void main(字符串[]args){
//创建具有初始容量的空数组deque
Deque Deque=新的ArrayDeque(8);
//使用add()方法在deque中添加元素
增加(15);
增加(30);
增加(20);
增加(18);
//让我们打印deque中可用的所有元素
for(整数:deque){
System.out.println(“Number=“+Number”);
}
//集合。洗牌((列表)deque);
//getFirst()将在第一个(头)位置检索元素
int retval=deque.getFirst();
System.out.println(“检索到的元素为=“+retval”);
}
}
我知道如何洗牌列表
,但如何使用集合
洗牌一个数据?
请用代码回复,因为我还不完全习惯Java术语/理论,我还在学习。您不能使用
Java.util.Collections
洗牌Deque
;它仅适用于实现列表的集合。您可以编写自己的随机播放例程,也可以先创建一个列表
,对其进行随机播放,然后将结果复制到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);
}
publicstaticvoidmain(字符串[]args){
//创建具有初始容量的空数组deque
列表=新的ArrayList(8);
//使用add()方法在deque中添加元素
增加(15);
增加(30);
增加(20);
增加(18);
//让我们打印deque中可用的所有元素
用于(整数:列表){
System.out.println(“Number=“+Number”);
}
集合。洗牌(列表);
Deque Deque=新的ARRAYDEFUE(列表);
//getFirst()将在第一个(头)位置检索元素
int retval=deque.getFirst();
System.out.println(“检索到的元素为=“+retval”);
}
当然,编写自己的洗牌例程的问题是,Deque
接口不提供移动元素的方法。集合。洗牌(List)只接受List,因此为了洗牌Deque,需要使用Deque的LinkedList实现。LinkedList实现了Deque和List接口。看
publicstaticvoidmain(字符串[]args){
LinkedList=新建LinkedList();
//使用add()方法在deque中添加元素
增加(15);
增加(30);
增加(20);
增加(18);
//让我们打印deque中可用的所有元素
用于(整数:列表){
System.out.println(“Number=“+Number”);
}
集合。洗牌(列表);
int retval=list.getFirst();
System.out.println(“检索到的元素为=“+retval”);
}
谢谢!我会选择这个作为答案:)快速提问,阅读其他答案,我看到:注意,Deque只是一个接口,要使用一个也实现了List的类,然后你就可以使用Collections。Shuffle(List)
这就是你上面所做的吗?@Ryan-没错。如果您想要实现List
和Deque
的单个具体集合类型,可以使用LinkedList
。请注意,基于数组的集合对随机元素的访问时间为O(1),而LinkedList
为O(n)。(洗牌ArrayList
比洗牌LinkedList
更快)但是,对于直接迭代或在开始和/或结束时重复操作,LinkedList
的性能与基于数组的集合一样好(有时更好)。通常“编写自己的”并没有多大意义,除非它是绝对性能关键的。洗牌的标准答案可能是在ArrayList中执行(因为洗牌需要随机访问),然后将其复制回LinkedList/Deque。出于这个原因,Collections.shuffle()将非随机访问列表随机排列在一个数组中。谢谢,我将查看您发布的链接。我已经知道如何使用列表,但deque部分让我感到困惑+1'ed。
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);
}