把两个java集合里的数据一一对应_java集合型数据结构,看这篇就够了

前言

java共有八大类型的数据类型,int、byte、double、long、boolean、 float 、short、char,这些远远不够使用,因为我们还需要用到集合类型的数据结构,如数组、链表等。在这里主要实现一下背包、队列和栈三种数据结构,基于链表实现。

定义api

9c93b1a9a99752d48bf3a144e95b9de9.png

背包api

a9fec0b1e1ba4a8fd19145b6916e5abc.png

队列api

5168d859bccb04fd07ed0db6ad20fec6.png

栈api

链表节点定义

private class Node{    Item item;    Node next;}

背包

背包是一种不支持从中删除元素的集合类型,它的目的是帮助用例收集元素并迭代遍历所有收集到的元素。

定义节点

private Node first;//链表的首结点private Integer N = 0;//元素数

添加元素到首结点

public void add(Item item){    Node oldFirst = first;    first = new Node();    first.item = item;    first.next = oldFirst;    N ++;}

判断大小和判空实现

public boolean isEmpty(){    return N <= 0;}public Integer size(){    return N;}

添加迭代器

因为集合需要迭代,就要实现Iterable接口,并实现iterator()方法。我们可以通过该方法获取迭代器对象。

public class Bag implements Iterable {//实现迭代接口    @Override    public Iterator iterator() {        return new BagIterator();//通过该方法获取迭代器    }    private class BagIterator implements Iterator {//迭代器内部类实现Iterator接口        private Node itNode = first;        @Override        public boolean hasNext() {            return itNode!=null;        }        @Override        public Item next() {            Item item = itNode.item;            itNode = itNode.next;            return item;        }        @Override        public void remove() {        }    }

完整代码为

package com.tp.collection;import java.util.Iterator;/*** 背包* @param */public class Bag implements Iterable {    private Node first;    private Integer N = 0;    private class Node{        private Item item;        private Node next;    }    public void add(Item item){        Node oldFirst = first;        first = new Node();        first.item = item;        first.next = oldFirst;        N ++;    }    public boolean isEmpty(){        return N <= 0;    }    public Integer size(){        return N;    }    @Override    public Iterator iterator() {        return new BagIterator();    }    private class BagIterator implements Iterator {        private Node itNode = first;        @Override        public boolean hasNext() {            return itNode!=null;        }        @Override        public Item next() {            Item item = itNode.item;            itNode = itNode.next;            return item;        }        @Override        public void remove() {        }    }}

队列

队列是链表的尾部添加节点,在链表的头部删除节点。

由于需要在尾部操作节点,因此需要增加一个last节点指向尾部节点。

完成代码如下:

package com.tp.collection;import java.util.Iterator;/*** 队列* @param */public class Queue implements Iterable {    private Node first;    private Node last;    private Integer N = 0;    private class Node{        private Node next;        private Item item;    }    //尾结点添加    public void enqueue(Item item){        Node oldLast = last;        last = new Node();        last.item = item;        last.next = null;        if (isEmpty()){            first = last;        } else {            oldLast.next = last;        }        N++;    }    //首节点删除    public Item dequeue(){        Node oldFirst = first;        if (oldFirst!=null){            first = oldFirst.next;            N --;            return oldFirst.item;        }else{            return null;        }    }    public boolean isEmpty(){        return N<=0;    }    public Integer size(){        return N;    }    @Override    public Iterator iterator() {        return new QueueIterator();    }    private class QueueIterator implements Iterator{        Node current = first;        @Override        public boolean hasNext() {            return current!=null;        }        @Override        public Item next() {            Item item = current.item;            current = current.next;            return item;        }        @Override        public void remove() {        }    }}

基于链表的栈是在链表的头部插入和删除节点。

package com.tp.collection;import java.util.Iterator;public class Stack implements Iterable {    private Node first;    private Integer N = 0;    private class Node{        private Node next;        private Item item;    }    //添加元素    public void push(Item item){        Node oldFirst = first;        first = new Node();        first.next = oldFirst;        first.item = item;        N++;    }    //删除元素    public Item pop(){        Node current = first;        if (current==null){            return null;        }else {            first = current.next;            N--;            return current.item;        }    }    public boolean isEmpty(){        return N<=0;    }    public Integer size(){        return N;    }    @Override    public Iterator iterator() {        return new StackIterator();    }    private class StackIterator implements Iterator{        Node current = first;        @Override        public boolean hasNext() {            return current!=null;        }        @Override        public Item next() {            if (current!=null){                Item item = current.item;                current = current.next;                return item;            }            return null;        }        @Override        public void remove() {        }    }}

测试用例

package com.tp;import com.tp.collection.Bag;import com.tp.collection.Queue;import com.tp.collection.Stack;import java.util.Iterator;/*** Hello world!**/public class App{    public static void main( String[] args ){        Bag bag = new Bag<>();        bag.add("aaa");        bag.add("bbb");        bag.add("ccc");        System.out.println( bag.isEmpty() );        System.out.println( bag.size() );        Iterator it= bag.iterator();        while(it.hasNext()){            System.out.println( it.next() );        }        Queue queue = new Queue();        queue.enqueue("aaa");        queue.enqueue("bbb");        queue.enqueue("ccc");        System.out.println( queue.dequeue() );        System.out.println( queue.size());        Iterator it = queue.iterator();        System.out.println( it.hasNext());System.out.println( it.next());        System.out.println( queue.dequeue() );        System.out.println( queue.size() );        System.out.println( queue.dequeue() );        System.out.println( queue.isEmpty());        Stack stack = new Stack<>();        stack.push("aaa");        stack.push("bbb");        stack.push("ccc");        for (String s:stack){            System.out.println(s);        }        System.out.println(stack.pop());        System.out.println(stack.pop());        System.out.println(stack.size());        System.out.println(stack.isEmpty());    }}

总结

基于链表实现这三个集合都是比较类似的,都需要创建内部节点,需要创建迭代器内部类。

可以关注微信公众号,获取持续推送。

be2d203e007c8d323ec95470e8dd8333.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值