计算机科学中,集合是一组可变数量的数据项(也可能是0个)的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作。一般来讲,这些数据项的类型是相同的,或基类相同(若使用的语言支持继承)。列表(或数组)通常不被认为是集合,因为其大小固定,但事实上它常常在实现中作为某些形式的集合使用。集合的种类包括列表,集,多重集,树和图。枚举类型可以是列表或集。

中文名

集合

所属学科

计算机

释 义

一组可变数量的数据项的组合

列表

在列表中,数据项的顺序是确定的,也可以存在多个相同的数据项。列表支持的操作包括查找项目并找到其位置(若存在),将项目从列表中删除,在特定位置插入项目等。通常的队列,或称FIFO即是一个列表,该列表只能在一端添加项目,而在另一端删除项目。而栈,或LIFO则只能在同一端添加或删除项目。不管是队列还是栈,集合中项目的顺序都应当是一定的,因此这两种情况只是列表的特例。其它列表支持的操作包括排序,再一次说明了其中顺序的重要性。

列表的具体形式包括数组,链表等。

Java语言中实现类

List接口的实现类

List接口的实现类:ArrayList(数组列表)、LinkedList(链式列表)、Vector(向量)、Stack(栈)

ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素

LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素

Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

Stack:是Vector类的实现类

Java语言中实现类操作方法

List接口的操作方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

public class ArrayListDemo {

    public static void main(String[] args) {

        // 创建集合arrList,并向arrList中添加元素 1.414 1.732 2.236 2.449 2.718 3.14 

        ArrayList<Double> arrList = new ArrayList<Double>();

        arrList.add(1.414);

        arrList.add(1.732);

        arrList.add(2.236);

        arrList.add(2.449);

        arrList.add(2.718);

        arrList.add(3.14);

         

        System.out.print("原集合arrList中的元素:");

        for (int i=0; i<arrList.size();i++) {

            System.out.print(arrList.get(i)+" ");

        }

        //删除原集合arrList中的一些元素

        arrList.remove(3.14);

        //根据索引设置修改原集合arrList中的相关值

        arrList.set(4, 1.414);

         

        //使用迭代器循环遍历现集合arrList集合

        System.out.print(" 现集合arrList中的元素:");

        Iterator<Double> it = arrList.iterator();

        while (it.hasNext()) {//判断是否有下一个元素

                 System.out.print(it.next()+"、");//获得下一个元素及其名称

        }

        //查询现集合arrList中的相关

        if(arrList.contains(1.414)){

            System.out.println(" 现集合arrList中有此值");

        }else{

            System.out.println(" 现集合arrList中无此值");

        }

    }

}

与列表不同,在集中,数据项是无序的,也不允许存在相同数据项。集支持添加、删除和查找项目。一些语言内建对集的支持,而在其它语言中,可以利用散列表实现集。

多重集

多重集的行为类似于集,其中数据项是无序的。但在多重集中,可以存在相同的数据项。多重集支持的操作包括添加、删除项,查询相同项在多重集中出现的次数。多重集可以通过排序转换成列表。

关联数组

关联数组(或称查找表,字典等)的行为和字典相似,为键(例如字典中的单词)输入提供一个值(如字典中的定义)输出。值可以是对复杂数据结构的引用。通常使用散列表实现高效率的关联数组。

在树中,“根”节点与一定数量的数据项以亲-子关系联系起来,而其子数据项也与另外的数据项以同样的方式联系。除了根节点的每个项都有且只有一个父节点,并可能有一些子节点。树支持的操作包括遍历,插入等。用于排序操作的树通常称为堆。通常使用树来保存存在包含亲-子关系的数据,例如菜单,目录及其中文件等。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

publicclassTreeMapDemo{

publicstaticvoidmain(Stringargs){

Map<String,Character>treeMap=newTreeMap<String,Character>();

//向创建集合哈希表对象添加元素"I""love""learning""the""Java""language""!"

treeMap.put("01",'J');

treeMap.put("02",'a');

treeMap.put("03",'v');

treeMap.put("04",'a');

treeMap.put("05",'L');

treeMap.put("06",'a');

treeMap.put("07",'n');

treeMap.put("08",'g');

treeMap.put("09",'u');

treeMap.put("10",'a');

treeMap.put("11",'g');

treeMap.put("12",'e');

//使用第三种:通过entrySet()方法调用iterator()方法遍历哈希表treeMap中的一些元素

System.out.println("通过entrySet()方法遍历哈希表treeMap中的key和value:");

System.out.print("treeMapKey=");

Iterator<Entry<String,Character>>it1=treeMap.entrySet().iterator();

while(it1.hasNext()){

Entry<String,Character>entry1=it1.next();

System.out.print(entry1.getKey()+"");

}

System.out.print("treeMapValue=");

Iterator<Entry<String,Character>>it2=treeMap.entrySet().iterator();

while(it2.hasNext()){

Entry<String,Character>entry2=it2.next();

System.out.print(entry2.getValue());

}

//删除哈希表treeMap中的一些元素

treeMap.remove("01");

treeMap.remove("02");

treeMap.remove("03");

treeMap.remove("04");

//第四种

System.out.println(" 通过values()方法遍历哈希表treeMap所有的value,但不能遍历key");

System.out.print("treeMapValue=");

for(Charactervalue:treeMap.values()){

System.out.print(value);

}

}

}

在图中,每个数据项都可以与一个或多个其它数据项联系起来,其中每个节点都是平等的,类似于无根节点、无亲-子关系的树。图支持的操作包括遍历,查找等。图常常用于对实际问题进行建模,并解决这些问题。在生成树协议中,建立一张代表网络结构的图(或称网格),从而了解应当断开哪些链路以避免数据回圈。

抽象概念及其实现

如上所述,集合,以及集合的各种分类都只是抽象概念。由于名字相同或相似,集合及其在各种语言中的实现常常会造成文字上的混淆。集合,列表,集,树等名字究竟是数据结构,抽象数据类型抑或类只能通过具体分析来确定。其中,集合则是计算问题的解决方案中抽象程度最高的概念。从这个方面来看,若过于关注其实现,则可能会对理解集合的数学概念产生反作用。