黑马程序员技术交流社区

标题: 用集合完成扑克牌操作中一个容易忽略的细节 [打印本页]

作者: 黑马乔荣柱    时间: 2012-10-15 23:27
标题: 用集合完成扑克牌操作中一个容易忽略的细节
本帖最后由 彼岸花 于 2012-10-15 23:33 编辑

import java.util.*;
class Test
{
        public static void main(String[] args)
        {
                //得到扑克牌
                List<Poker> list=PokerUtil.getPokers();
                PokerUtil.xipai(list);
                PokerUtil.showPokers(list);
                Poker p=new Poker("10","红桃");
                int index=PokerUtil.findPoker(list,p);
                if(index==-1){
                        System.out.println("没有这张扑克牌  "+p);
                }else{
                        System.out.println(p+" 在"+(index+1)+"位置");
                }
        }
}
//声明扑克类
class Poker
{
        String number;
        String color;
        public Poker(){}
        public Poker(String number ,String color){
                this.number=number;
                this.color=color;
        }
         public boolean equals(Object obj){   
               
                Poker p=(Poker)obj;     

                return p.number.equals(number)&&p.color.equals(color);
        }

         public String toString(){
                return color+number;
        }
}
//扑克牌工具类
class PokerUtil
{
        public static final String[] ns={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        public static final String[] cs={"黑桃","红桃","方块","梅花"};
        //查找某张牌
        public static int findPoker(List<Poker> list,Poker p){
                return list.indexOf(p);  
        }
        //洗牌
        public static void xipai(List<Poker> list){
                Random ran=new Random();
                for(int i=0;i<100;i++){
                        int n1=ran.nextInt(list.size()); //0-52
                        int n2=ran.nextInt(list.size());
                        Poker p1=list.get(n1);
                        Poker p2=list.get(n2);
                        //将n1与n2位置上的元素进行交换.
                        list.set(n1,p2);
                        list.set(n2,p1);
                }
        }
        //显示扑克
        public static void showPokers(List<Poker> list){
                for(int i=0;i<list.size();i++){
                        if(i%ns.length==0){
                                System.out.println();
                        }
                        System.out.print(list.get(i)+"  ");
                }
        }
        //得到52张扑克牌
        public static List<Poker> getPokers(){
                List<Poker> list=new ArrayList<Poker>();
                for(int i=0;i<cs.length;i++){
                        for(int j=0;j<ns.length;j++){
                                list.add(new Poker(ns[j],cs));
                        }
                }
                return list;
        }
}
List集合在使用indexOf方法时,是用参数与集合中所有元素进行equals ,所以需要重写equals方法,因为List是有顺序的,在比较时,从头到尾依次比较,如果集合中有一个元素与参数equals为true,那么就将这个元素索引返回。如果集合中没有,那么返回-1。
总结:对于自定义类来说 在用到indexOf方法时 都需要在自定义类内重写equals方法















欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2