Javase学习06-通过实例体会多态

数组和链表都能实现增删查改,数组更便于查询,链表更便于增删。我们有时要对数据进行不同的操作,要频繁切换处理数据的方式,这时就可以用多态来实现。

1. 首先定义一个接口

该接口定义了增删查改等基本功能

package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public interface Super {
    /**
     * 1.定义添加数据功能
     * @param data
     */
    void add(Integer data);

    /**
     * 2.定义删除数据功能
     * @param index
     */
    void delete(int index);

    /**
     * 3.定义查询数据功能
     * @param index
     * @return
     */
    Integer get(int index);

    /**
     * 4.定义修改数据功能
     * @param index
     * @param newValue
     */
    void update(int index,Integer newValue);

    /**
     * 5.定义打印数据功能
     */
    void print();
}
View Code

2. 数组类实现接口

package polymorphic;


/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class SuperArray implements Super{
    private int[] arr;
    private int currentIndex = -1;

    public SuperArray(int size) {
        arr = new int[size];
    }

    /**
     * 定义数组默认长度为10
     */
    public SuperArray() {
        this(10);
    }

    /**
     * 1.增加数据
     */
    @Override
    public void add(Integer data) {
        currentIndex++;
        if (currentIndex >= arr.length) {
            int[] newArr = new int[currentIndex * 2];
            for (int j = 0; j < arr.length; j++) {
                newArr[j] = arr[j];
            }
            arr = newArr;
        }
        arr[currentIndex] = data;
    }

    /**
     * 2.删除某个数据
     */
    @Override
    public void delete(int index) {
        if (index < 0 || index > currentIndex) {
            System.out.println("数组中没有这个数!");
        } else {
            for (int i = index; i < currentIndex; i++) {
                arr[i] = arr[i + 1];
            }
            currentIndex--;
        }
    }

    /**
     * 3.通过下标查询某个数据
     * @return
     */
    @Override
    public Integer get(int index) {
        return arr[index];
    }

    /**
     * 4.修改数据
     */
    @Override
    public void update(int index, Integer newValue) {
        arr[index] = newValue;
    }

    /**
     * 5.输出数据
     */
    @Override
    public void print() {
        for (int i = 0; i <= currentIndex; i++) {
            if (i == currentIndex) {
                System.out.println(arr[i]);
            } else {
                System.out.print(arr[i] + ",");
            }

        }
    }
}
View Code

3.链表类实现接口

节点类:
package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class Node {

    private Integer data;
    private Node next;

    public Node(Integer data) {
        this.data = data;
    }

    public Integer getData() {
        return data;
    }

    public void setData(Integer data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
View Code
链表类:
package polymorphic;


/**
 * @author: TSCCG
 * @date: 2021/5/16
 */
public class SuperLink implements Super{

    private Node head;
    private int size;

    /**
     * 1.从链表尾部添加节点
     */
    @Override
    public void add(Integer data) {
        //创建新节点
        Node newNode = new Node(data);
        if (size == 0) {
            //当链表为空时,使新节点成为头节点
            head = newNode;
        } else {
            //当链表不为空时,找到当前链表的末节点,使其指向新节点,新节点成为新的末节点
            findEnd(head).setNext(newNode);
        }
        //链表长度加1
        size++;
    }

    /**
     * 2.通过下标删除节点
     */
    @Override
    public void delete(int index) {
        Node node = getNode(index);
        //如果删除的节点是第一个节点,直接使head的后一位节点成为新的头节点即可
        if (node.equals(head)) {
            head = node.getNext();
        } else {
            getNode(index - 1).setNext(node.getNext());
        }
        size--;
    }

    /**
     * 3.通过下标找到目标节点
     * @return
     */
    public Node getNode(int index) {
        Node tempNode = head;
        for (int i = 0; i < index; i++) {
            tempNode = tempNode.getNext();
        }
        return tempNode;
    }

    /**
     * 3.1通过下标返回该节点的值
     * @param index
     * @return
     */
    @Override
    public Integer get(int index) {
        Node tempNode = head;
        for (int i = 0; i < index; i++) {
            tempNode = tempNode.getNext();
        }
        return tempNode.getData();
    }
    /**
     * 3.2找到尾节点
     */
    public Node findEnd(Node node) {
        if (node.getNext() == null) {
            return node;
        }
        //使用递归
        return findEnd(node.getNext());
    }

    /**
     * 4.更改目标节点的值
     */

    @Override
    public void update(int index, Integer newValue) {
        //首先根据下标找到目标节点,然后将新的值赋给它
        getNode(index).setData(newValue);
    }

    /**
     * 5.显示所有节点信息
     */
    @Override
    public void print() {
        //因为不能随意改变head的位置,故定义一个临时节点代替head
        Node tempNode = head;
        //当临时节点不为空时,说明仍在链表内
        while (tempNode != null) {
            if (tempNode.getNext() == null) {
                System.out.println(tempNode.getData());
            } else {
                System.out.print(tempNode.getData() + ",");
            }
            tempNode = tempNode.getNext();
        }
    }

}
View Code

4. 测试类

package polymorphic;

/**
 * @author: TSCCG
 * @date: 2021/5/18
 */
public class Test {
    public static void main(String[] args) {
        //当需要更换为数组时,仅需将SuperLink改为SuperArray即可对以下所有语句进行修改
        Super su = new SuperLink();
//        Super su = new SuperArray();
        su.add(4);
        su.add(1);
        su.add(3);
        su.add(2);
        su.print();
        su.delete(2);
        su.print();
        System.out.println(su.get(1));
        su.update(0,5);
        su.print();
    }

}
View Code

结果:

4,1,3,2
4,1,2
1
5,1,2
posted @ 2021-05-18 18:03  TSCCG  阅读(44)  评论(0编辑  收藏  举报