一、集合和数据结构
1.数学集合
2.在软件开发中应用广泛:商品列表
3.java中使用接口Collection定义了集合的概念,Collection接口定义了集合的功能抽象,添加元素,删除元素,集合的并,交,差
例子:
<span style="font-size:14px;">public static void main(String[] args) { Collection cards=null; cards=new ArrayList(); System.out.println(cards.isEmpty()); //</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:10px;">isEmpty()方法判断集合是否为空</span></span><span style="font-size:14px;"> cards.add(new Card(Card.SPADE,Card.NINE));//add()方法向集合中添加对象 System.out.println(cards.isEmpty()); System.out.println(cards.size()); //size()方法获取集合的大小 cards.add(new Card(Card.SPADE,Card.TEN)); cards.add(new Card(Card.SPADE,Card.JACK)); cards.add(new Card(Card.SPADE,Card.QUEEN)); cards.add(new Card(Card.SPADE,Card.KING)); cards.add(new Card(Card.SPADE,Card.ACE)); System.out.println(cards.size()); System.out.println(cards); Collection others=new ArrayList(); others.add(new Card(Card.JOKER,Card.BLACK)); others.add(new Card(Card.JOKER,Card.COLOR)); cards.addAll(others);<span style="white-space:pre"> </span> //addAll()方法实现集合的合并 System.out.println(cards); Card ace=new Card(Card.SPADE,Card.ACE); System.out.println(cards.contains(ace));//contains底层会调用equals,判断是否包含特定元素 }</span>Collection具体还有那些方法见Java API
4.java提供了集合的实现类:ArrayList,LinkedList,HashSet等
例子:
public static void main(String[] args) { // List cards=new ArrayLiat();//底层用数组实现 List cards=new LinkedList();//底层用双向循环链表实现 for(int rank=Card.THREE;rank<=Card.DEUCE;rank++){ cards.add(new Card(Card.DIAMOND,rank));<span style="white-space:pre"> </span>//add()方法向链表中添加元素 cards.add(new Card(Card.CLUB,rank)); cards.add(new Card(Card.HEART,rank)); cards.add(new Card(Card.SPADE,rank)); } cards.add(new Card(Card.JOKER,Card.BLACK)); cards.add(new Card(Card.JOKER,Card.COLOR)); System.out.println(cards); Card c=(Card)cards.get(3);//get(index),根据下标来查看链表元素 System.out.println(c); //洗牌 Random r=new Random(); for(int i=cards.size()-1;i>0;i--){ int idx=r.nextInt(i); Card x=(Card)cards.get(i); x=(Card)cards.set(idx, x); cards.set(i, x); } System.out.println(cards); }
5.LinkedList是使用双向循环链表实现的线性表,ArrayList是使用变长数组实现的线性表集合
例子:
class MyLinkedList{//链表 Node head; public MyLinkedList() { head=new Node(new Card(Card.HEART,Card.NINE)); head.next=new Node(new Card(Card.HEART,Card.TEN)); head.next.next=new Node(new Card(Card.HEART,Card.JACK)); head.next.next.next=new Node(new Card(Card.HEART,Card.QUEEN)); } public String toString(){<span style="white-space:pre"> </span>//覆盖的toString方法 return head.toString(); } class Node{//内部类,结点 Object data; Node next; public Node(Object data){ this.data=data; } public String toString(){ return data+(next!=null?"->"+next:""); } } }
public static void main(String[] args) { // TODO Auto-generated method stub MyLinkedList list=new MyLinkedList(); System.out.println(list); }
6.线性表(List接口)是经常使用的
7.Set无序且不重复
HashSet利用HashMap实现,就是只有key的HashMap
例子:
public static void main(String[] args) { Map users=new HashMap(); //put构建散列表 users.put("john", new User("john","123"));//put是向哈希表中加一项 users.put("tom", new User("tom","123")); users.put("jerry", new User("jerry","123")); users.put("robin", new User("robin","123")); //User u=(User)users.get("john");//get是从哈希表中找到对应项 Scanner sc=new Scanner(System.in); String name=sc.nextLine(); String pwd=sc.nextLine(); if(!users.containsKey(name)){//判断是否包含关键字 u==null System.out.println("无此用户"); return; } User u=(User)users.get(name);//将关键字绑定的对象返回回来 if(!u.pwd.equals(pwd)){ System.out.println("密码错误"); return; } System.out.println("欢迎您:"+u.name); } } class User{ String name; String pwd; public User(String name,String pwd){ this.name=name; this.pwd=pwd; } }
更具体的用法见Java API
二、集合的应用
贪吃蛇
1.蛇包含节点的(线性)集合,节点在行列坐标(i,j)的位置
2.蛇可以动,向当前方向前进一步,向指定方向前进一步,不可以反向
3.蛇在一个面板中运行,面板控制行列坐标,提供显示方法
4.重构Worm类,提供检查坐标是否在蛇身上的方法
5.提供测试类,测试蛇在面板上运行
①节点类,坐标
②蛇类,向当前方向移动,向指定方向移动
③面板类,控制坐标的设置,显示蛇的位置和移动