词典的实现(2)-借助顺序表(数组)实现词典

一,思路

1,词典实现类ArrayDictionary.java肯定要implements 词典的接口DictionaryInterface.java(参考:http://www.cnblogs.com/hapjin/p/4573826.html)。其次,为了序列化,还要implements Serializable接口

2,由于词典中的每个元素是一个键值对。因此,需要将查找键 和 值 封装在同一个对象中,因而定义了Entry.java来表示词典中的每个元素。其中,Entry类是作为ArrayDictionary的内部类来实现的。

3,由于每个Entry对象表示一个词典元素,因此ArrayDictionary.java需要一个Entry类型的数组来存放词典元素。这也是文章的标题--借助顺序表来实现词典的原因。

再深入讨论下,我们知道在JAVA类库中ArrayList.java就相当于已经帮程序员实现好了一个顺序表(数组),我们不需要再去关注数组的具体实现细节以及如何遍历数组,而是直接用ArrayList.java中的各种方法(add,remove……)来完成数组的基本操作,通过 iterator()方法获得遍历数组的迭代器。也可以借助ArrayList.java中方法来辅助实现DictionaryInterface接口中定义的方法。

但是,在本例中,采用的是自定义数组来实现词典的,因此就需要根据DictionaryInterface接口中的方法以及自已的需要来完成ArrayDictionary.java中的方法。

下面,具体理清下迭代器的实现思路:在ArrayDictionary.java中定义了三个私有内部类分为表示实现三个迭代器:

class EntryIterator<Entry>实现遍历Entry数组的迭代器

class KeyIterator<K>实现遍历查找键的迭代器

class ValueIterator<V>实现 值(Value) 的迭代器

其中,后两个迭代器会用到遍历Entry数组的迭代器,因为键(Key)和值(Value)是封装在Entry中的。

同时,还在ArrayDictionary.java定义了三个相应的获取遍历器的方法来获取上述三个遍历器。

未完待续……

时间: 2024-11-07 11:01:29

词典的实现(2)-借助顺序表(数组)实现词典的相关文章

顺序表--数组

顺序表结点的存储地址计算公式: 第i个数据元素的存储位置:Loc(ai)=Loc(ai)+(i-1)*l:1≤i≤n(l为每个元素需占l个存储单元) 第(i+1)个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)的关系:Loc(ai+1)=Loc(ai)+l; 数组: #define OK 1 #define ERROR -1 #define MAX_SIZE 100 typedef int Status ; typedef int ElemType ; typede

顺序表(数组)和链表的比较

特点对比: 1.存取方式上,数组可以顺序存取或者随机存取,而链表只能顺序存取: 2.存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定: 3.存储空间上,链表由于带有指针域,存储密度不如数组大: 4.按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n): 5.按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn): 6.插入和删除时,数组平均需要移动n/2个元素,而链表只

C++ 数据结构学习一(顺序表)

//sequentiallist.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; using std::endl; const int MaxSize=100; //顺序表数组最大值 template<class T>class SeqList //定义模板类SeqList(顺序表){ public: SeqList() { length=0; } //无参构造函数,建立一个空的顺

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

数据结构学习-数组A[m+n]中依次存放两个线性表(a1,a2&#183;&#183;&#183;am),(b1,b2&#183;&#183;&#183;bn),将两个顺序表位置互换

将数组中的两个顺序表位置互换,即将(b1,b2···bn)放到(a1,a2···am)前边. 解法一: 将数组中的全部元素(a1,a2,···am,b1,b2,···bn)原地逆置为(bn,bn-1,···b1,am,am-1···a1),再对前n个元素和后m个元素分别逆置,得到(b1,b2···bn,a1,a2···am),从而实现位置互换. 代码: void Reverse(int a[],int left,int right,int arraySize) {//逆转(aleft,aleft

使用JAVA数组实现顺序表

1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象. 2,默认构造方法创建了一个默认大小为16的Object数组:带参数的构造方法创建一个指定长度的Object数组 3,实现的顺序表的基本操作有:返回表的长度.获取指定索引处的元素(注意是索引,而不是位置.索引以下标0开始,位置以下标1开始).按值查找数据元素的位置.直接插入元素(顺序表尾部).向指定位置插入元素.直接删除元素(在顺序表尾部).删除指定索引处元素.判断表是否为空.清空表. 1 im

基于动态分配的数组的顺序表(兼具Boost单元测试)

我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分配的数组的顺序表绝大部分跟基于静态分配的数组的顺序表是一样的,只需在后者程序上改动一小部分即可. 第一,我们不需定义一个容量常量CAPACITY,而是定义一个私有变量myCapacity. 第二,类的构造函数需要改进一下.我们需要类在被实例化时自动申请内存,即需添加下边程序: ElementType

【C语言】顺序表,数组

顺序表的搭建,就是一个本身的结构,利用的是数组,开辟的内存空间大小是固定的.没有链式结构那样的开辟空间的可控性.最基本的数据结构认知. 然后我们来看看数据结构中的基本实现和思想: #include "seqList.h" #include <stdio.h> #include <assert.h> //顺序表的初始化 void InitSeqList(SeqList* seq) { int _index = 0; assert(seq); for(;_index

顺序表与数组的区别和联系

顺序表是在计算机内存中以数组的形式保存的线性表. 顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表,顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中.线性表采用指针链接的方式存储就称之为链表. 线性表是从逻辑结构的角度来说的,除了头和尾之外,它的每一个元素都只有一个前驱元素和一个后驱元素.各种队列(单向.双向.循环队列),栈等都是线性表的不同例子. 而数组是从物理存贮的角度来说的,线性表可以用数组存贮也可以用链表来存贮.同