数据结构(二)顺序结构实现集合Set

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/real_ilin/article/details/80027092

一、集合的定义

集合是由相同类型的互不相同的数据元素聚焦而成,元素之前不存在任何逻辑关系。顺序结构就是使用数组,元素与元素顺序存储,但是元素之间没关系,也就是元素无论在哪个位置存储都是一样的。

a 1 , a 2 , a 3 , . . . , a n

二、集合的抽象数据类型

  • 接口 Set定义了集合的操作
package set;

public interface Set {
    //添加元素,是否成功返回一个boolean
    boolean add(Object obj);
    //删除元素
    boolean remove(Object obj);
    //是否包含一个元素
    boolean contains(Object obj);
    //根据index返回元素
    Object value(int i);
    //根据元素查询
    Object find(Object obj);
    //set中元素的个数
    int size();
    //判断集合是否为空
    boolean isEmpty();
    //输出(打印)所有的元素
    void outputAll();
    //与另一个集合的并集
    Set union(Set set);
    //与另一个集合的交集
    Set intersection(Set set);
    //清除集合的所有元素---不用返回boolean
    void clear();
}

三、顺序结构实现Set

  • SequenceSet
package set;

import java.util.Arrays;

/**
 * 使用顺序结构存储来实现集合
 */
public class SequenceSet implements Set {
    //集合的最大长度
    private final int maxSize = 10;
    //用于存储元素的空集合
    private Object[] setArray;
    //集合的长度
    private int length;

    //构造函数进行初始化:长度为0,有一个10个长度的空集合,对成员变量进行初始化
    public SequenceSet() {
        length = 0;
        setArray = new Object[maxSize];
    }

    //初始化一个自定义长度的集合
    public SequenceSet(int n) {
        if (n <= 0) {
            System.out.println("集合的长度不能小于0");
            System.exit(1);
        } else {
            this.length = 0;
            this.setArray = new Object[n];
        }
    }

    /**
     * 1.如果集合中存在该值则返回false,集合中的元素不能重复
     * 2.检查数组的空间是否够用,如果不够用则扩大一倍,把原来的数据复制到新的数组中
     * 3.把obj插入到数组的最后一个位置上
     * 4.集合的长度+1
     * 5.返回true表示成功
     *
     * @param obj
     * @return
     */
    public boolean add(Object obj) throws IllegalArgumentException {
        if (obj == null) {
            throw new IllegalArgumentException("Argument can't be null");
        }

        for (int i = 0; i < length; i++) {
            if (obj.equals(setArray[i]))
                return false;
        }
        //length是集合的长度,如果与数组的长度相同则说明数据满了
        if (length == setArray.length) {
            //Object[] newArray = new Object[length * 2];
            //使用数组的扩容工具进行扩容的同时把原数组复制到新数组中
            Object[] newArray = Arrays.copyOf(setArray, length * 2);
            //可以优化为将引用setArray指向新的地址空间,然后只对setArray操作即可
            setArray = newArray;
        }
        setArray[length] = obj;
        length++;
        //打印数组的工具类:Arrays
        return true;
    }

    /**
     * 1.检查obj在数组中是否存在,如果存在,把这个数组的值复制到另一个数组,数组的长度-1,并返回true
     * 2.如果不存在,则返回false.
     *
     * @param obj
     * @return
     */
    public boolean remove(Object obj) {
        for (int i = 0; i < setArray.length; i++) {
            if (obj.equals(setArray[i])) {
                //如果存在则进行数组的复制
                Object[] removedArray = new Object[length - 1];
                System.arraycopy(setArray, 0, removedArray, 0, i);
                System.arraycopy(setArray, i + 1, removedArray, i, length - i - 1);
                setArray = removedArray;
                length--;
                return true;
            }
        }
        return false;
    }

    public boolean contains(Object obj) {
        if (obj == null) {
            throw new IllegalArgumentException("Argument can't be null");
        }
        for (int i = 0; i < setArray.length; i++)
            if (obj.equals(setArray[i])) return true;
        return false;
    }

    /**
     * 根据Index返回值
     *
     * @param index
     * @return
     */
    public Object value(int index) {
        if (index > length - 1 || index < 0) {
            throw new IllegalArgumentException("Wrong arg, please input a correct arg");
        }

        for (int i = 0; i < setArray.length; i++) {
            return setArray[index];
        }
        return null;
    }

    public Object find(Object obj) {
        if (obj == null) {
            throw new IllegalArgumentException("Argument can't be null");
        }
        for (int i = 0; i < setArray.length; i++)
            if (obj.equals(setArray[i])) return setArray[i];
        return null;
    }

    public int size() {
        return length;
    }

    public boolean isEmpty() {
        return length == 0;
    }

    public void outputAll() {
        for (int i = 0; i < setArray.length; i++)
            System.out.println(setArray[i]);
    }

    /**
     * 两个集合的并集
     *
     * @param set
     * @return
     */
    public Set union(Set set) {
        SequenceSet tempSet = new SequenceSet(setArray.length);
        for (int i = 0; i < setArray.length; i++)
            tempSet.setArray[i] = setArray[i];
        tempSet.length = length;
        SequenceSet destSet = (SequenceSet) set;
        for (int i = 0; i < destSet.length; i++)
            tempSet.add(destSet.setArray[i]);
        return tempSet;
    }

    /**
     * 求两个集合的交集,两个集合都包含
     *
     * @param set
     * @return
     */
    public Set intersection(Set set) {
        SequenceSet destSet = (SequenceSet) set;
        int len = destSet.size() > length ? length : destSet.size();
        SequenceSet tempSet = new SequenceSet(len);
        for (int i = 0; i < destSet.size(); i++)
            if(contains(destSet.setArray[i])) tempSet.add(destSet.setArray[i]);
        return tempSet;
    }

    public void clear() {
        length = 0;
    }

    @Override
    public String toString() {
        int iMax = length - 1;
        if (iMax == -1) return "[]";
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; ; i++) {
            sb.append(String.valueOf(setArray[i]));
            if (i == iMax)
                return sb.append("]").toString();
            sb.append(", ");
        }
    }
}
  • 测试类
package setTest;

import set.SequenceSet;

public class SequenceSetTest {
    public static void main(String[] args) {
        SequenceSet sequenceSet = new SequenceSet();
        //sequenceSet.add(null);
        sequenceSet.add("ok");
        sequenceSet.add("hello");
        sequenceSet.add("word");
        System.out.println(sequenceSet.toString());

        sequenceSet.remove("word");
        System.out.println(sequenceSet.toString());
        System.out.println(sequenceSet.remove("ko"));
        System.out.println(sequenceSet.toString());

        System.out.println(sequenceSet.size());

        System.out.println(sequenceSet.contains("ko"));

        System.out.println(sequenceSet.value(0));

        sequenceSet.clear();
        sequenceSet.add("apple");
        sequenceSet.add("banana");
        sequenceSet.add("pair");
        System.out.println(sequenceSet.toString());
        System.out.println(sequenceSet.size());

        SequenceSet unionSet = new SequenceSet();
        unionSet.add("testUnion");
        System.out.println(unionSet);


        SequenceSet interSet = new SequenceSet();
        interSet.add("apple");
        System.out.println(sequenceSet.intersection(interSet));
    }
}

猜你喜欢

转载自blog.csdn.net/real_ilin/article/details/80027092