黑马程序员技术交流社区
标题:
用集合解决扑克牌洗牌中遇到的异常
[打印本页]
作者:
黑马乔荣柱
时间:
2012-10-14 17:42
标题:
用集合解决扑克牌洗牌中遇到的异常
本帖最后由 彼岸花 于 2012-10-17 11:23 编辑
用集合给扑克牌洗牌
class Test
{
public static void main(String[] args)
{
String[] numall={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
String[] hsall={"黑桃","红桃","方块","梅花"};
List li=new ArrayList();
for(int i=0;i<4;i++){
for(int j=0;j<13;j++){
Poker po
=
new Poker(hsall,numall[j]);
li.add(po);
}
}
Random ran=new Random();
List li1=li.subList(0,26);
List li2=li.subList(26,52); //把集合分成两个li1和li2,每个的元素各26个
for(int l=0;l<100;l++){
int i=ran.nextInt(26);
int j=ran.nextInt(26);
int k=ran.nextInt(26);
Object p1=li1.get(i); //从li1中随机位置取一个元素p1
Object p2=li2.set(j,p1); //把p1和li2中随机位置的p2交换
li1.remove(p1); //把p1从原集合li1移除
li1.add(k,p2); //把p2插入li1随机位置
}
List list=new ArrayList();
list.addAll(li1);
list.addAll(li2);
System.out.println(list);
}
}
class Poker
{
String num;
String hs;
public Poker(String hs,String num){
this.num=num;
this.hs=hs;
}
public String toString(){
return hs+num;
}
}
编译时没错,运行时报异常:
Exception in thread "main" java.util.ConcurrentModificationException
已知问题出在红字部分
求解决
作者:
梁世喜
时间:
2012-10-14 18:59
package itheima.com.liang;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class TestPuker {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建扑克
Puker p=new Puker();
List<Card> list=p.getCards();//获取纸牌
//洗牌之前
System.out.println("洗牌之前:");
for(Card c:list){
System.out.println(c);
}
//洗牌之后
System.out.println("洗牌之后");
list=xiPai(list);
for(Card c : list)
{
System.out.println(c);
}
}
private static List<Card> xiPai(List<Card> list){
List<Card> temp=null;
if (list!=null)
{
temp=new ArrayList<Card>();
Random rand=new Random();
while(list.size()!=0){
//循环抽出一张牌放到临时集合temp中
Card c=list.remove(rand.nextInt(list.size()));
temp.add(c);
}
}
return temp;
}
}
class Puker{
public Puker(){}
private List<Card> puker=new ArrayList<Card>();
public List<Card> getCards(){
return puker;
}
//初始化纸牌
{
for(int i=1;i<=13;i++){
for(int j=1;j<=4;j++)
{
Card c=new Card(i,j);
puker.add(c);
}
}
puker.add(new Card(14,0));
puker.add(new Card(14,1));
}
}
class Card{
private int Ds;
private int Hs;
private String[] hs={"黑桃","红桃","梅花","方块"};
private String[] ds={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
public Card(int ds,int hs){
this.setDs(ds);
this.setHs(hs);
}
public String toString(){
if (Ds==14&&Hs==0)
return "大王";
else if(Ds==14&&Hs==1)
return "小王";
else
return hs[Hs-1]+ds[Ds-1];
}
/**
* @return the ds
*/
public int getDs() {
return Ds;
}
/**
* @param ds the ds to set
*/
public void setDs(int ds) {
Ds = ds;
}
/**
* @return the hs
*/
public int getHs() {
return Hs;
}
/**
* @param hs the hs to set
*/
public void setHs(int hs) {
Hs = hs;
}
}
复制代码
这是我写的。请指教
作者:
黑马乔荣柱
时间:
2012-10-14 19:28
我的异常出在哪?
作者:
AngieFans85
时间:
2012-10-14 22:35
本帖最后由 马镱洵 于 2012-10-14 22:45 编辑
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PokerTest {
public static void main(String[] args) {
String[] numall = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J",
"Q", "K", "A" };
String[] hsall = { "黑桃", "红桃", "方块", "梅花" };
List li = new ArrayList();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 13; j++) {
Poker po = new Poker(hsall[i], numall[j]);
li.add(po);
}
}
Random ran = new Random();
// List li1 = li.subList(0, 26);
// List li2 = li.subList(26, 52); // 把集合分成两个li1和li2,每个的元素各26个
<FONT color=red> // 注意了, 通过li.subList()方法返回的是li的一个子List,不能对子List调用add()与remove()
// 方法,否则就会抛出并发异常.所以要对List进行add与remove操作的话,就要重新构造集合 对象.
</FONT> List li1 = new ArrayList(li.subList(0, 26));
List li2 = new ArrayList(li.subList(0, 26)); for (int l = 0; l < li1.size(); l++) {
int i = ran.nextInt(26);
int j = ran.nextInt(26);
int k = ran.nextInt(26);
Object p1 = li1.get(i); // 从li1中随机位置取一个元素p1
Object p2 = li2.set(j, p1); // 把p1和li2中随机位置的p2交换
li1.remove(p1); // 把p1从原集合li1移除
li1.add(k, p2); // 把p2插入li1随机位置
}
List list = new ArrayList();
list.addAll(li1);
list.addAll(li2);
System.out.println(list);
}
}
class Poker {
String num;
String hs;
public Poker(String hs, String num) {
this.num = num;
this.hs = hs;
}
public String toString() {
return hs + num;
}
}
复制代码
作者:
黑马乔荣柱
时间:
2012-10-14 23:23
马镱洵 发表于 2012-10-14 22:35
多谢你的指导
作者:
王震阳老师
时间:
2012-10-14 23:35
import java.util.ArrayList;
import java.util.*;
class TestPoker
{
public static void main(String[] args)
{
String[] numall={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
String[] hsall={"黑桃","红桃","方块","梅花"};
List li=new ArrayList();
List list=new ArrayList();
for(int i=0;i<4;i++){
for(int j=0;j<13;j++){
Poker po=new Poker(hsall[i],numall[j]);
li.add(po);
}
}
//System.out.println(li);
Random ran=new Random();
List li1=li.subList(0,26);
for(int l=0;l<10;l++)
{
int i=ran.nextInt(26);
int j=ran.nextInt(26);
Object p1=li1.get(i); //从li1中随机位置取一个元素p1
Object p2=li1.set(j,p1); //把p1和li2中随机位置的p2交换
li1.remove(i); //把p1从原集合li1移除
li1.add(j,p2); //把p2插入li1随机位置
}
list.addAll(li1);
List li2=li.subList(26,52); //把集合分成两个li1和li2,每个的元素各26个
for(int l=0;l<100;l++)
{
int i=ran.nextInt(26);
int j=ran.nextInt(26);
Object p3=li2.get(i);
Object p4=li2.set(j,p3);
li2.remove(i);
li2.add(j,p3);
}
list.addAll(li2);
System.out.println(list);
}
}
class Poker
{
String num;
String hs;
public Poker(String hs,String num){
this.num=num;
this.hs=hs;
}
public String toString(){
return hs+num;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2