`
JAVA海洋
  • 浏览: 601440 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

Java数据结构---基于数组的表

阅读更多
我没看过其他语言版的数据结构,但觉得java的实现方法很巧妙--用类和对象来实现.基于数组的表,思想很简单就是定义一个类用来存储一组数据,我定义的是ArrayListClass类,在类中定义用来操作数组的方法.其实就是这么简单,但具体操作起来就会遇到很多麻烦了!
我们这个ArrayListClass类中首先应该包括一个数组型的域list,用来存放数据,这样放在同一数组中数据之间就产生了位置上的联系,使对数据的操作便的简单.然而这个数组到底是什么数据类型的,我们期望这个表能用于所有的数据类型,我们不能将他单纯的固定成某一种.所以我们必须将这个数据普通化,解决的办法就是定义一个类,作为所有数据类型的超类.看这个DataElement:
publicabstractclassDataElement{
publicabstractbooleanequals(DataElementotherElement);
publicabstractintcompareTo(DataElementotherElement);
publicabstractvoidmakeCopy(DataElementotherElement);
publicabstractDataElementgetCopy();
}

将他定义成为抽象的,再在定义其他数据类型时继承并实现它,我定义了两个数据类型IntElement和StringElement:

IntElement:

publicclassIntElementextendsDataElement{
protectedintnum;

//constructors
publicIntElement(){
num=0;
}
publicIntElement(intnumber){
num=number;
}
publicIntElement(IntElementotherElement){
num=otherElement.num;
}

///get-setMethods
publicvoidsetNum(intnumber){
num=number;
}
publicintgetNum(){
returnnum;
}


/*(non-Javadoc)
*@seeDataElement#equals(DataElement)
*/
publicbooleanequals(DataElementotherElement){
//TODOAuto-generatedmethodstub
IntElementnewe=(IntElement)otherElement;
return(this.num==newe.num);
}

/*(non-Javadoc)
*@seeDataElement#compareTo(DataElement)
*/
publicintcompareTo(DataElementotherElement){
//TODOAuto-generatedmethodstub
IntElementnewe=(IntElement)otherElement;
if(this.num==newe.num)
return0;
elseif(this.num>newe.num)
return1;
else
return-1;
}

/*(non-Javadoc)
*@seeDataElement#makeCopy(DataElement)
*/
publicvoidmakeCopy(DataElementotherElement){
//TODOAuto-generatedmethodstub
IntElementnewe=(IntElement)otherElement;
this.num=newe.num;

}

/*(non-Javadoc)
*@seeDataElement#getCopy()
*/
publicDataElementgetCopy(){
//TODOAuto-generatedmethodstub
IntElementnewElement=newIntElement();
newElement.num=this.num;
returnnewElement;
}
publicStringtoString(){
returnString.valueOf(num);
}
}

StringElement:

publicclassStringElementextendsDataElement{

/**
*
*/
privateStringstr;

//constructors
publicStringElement(){
str=null;

}
publicStringElement(Stringstring){
str=string;
}
publicStringElement(StringElementotherElement){
str=otherElement.str;
}

//get-setMethods
publicvoidsetStr(Stringstring){
str=string;
}
publicStringgetStr(){
returnstr;
}

/*(non-Javadoc)
*@seeDataElement#equals(DataElement)
*/
publicbooleanequals(DataElementotherElement){
//TODOAuto-generatedmethodstub
StringElementnewe=(StringElement)otherElement;
return(str==newe.str);
}

/*(non-Javadoc)
*@seeDataElement#compareTo(DataElement)
*/
publicintcompareTo(DataElementotherElement){
//TODOAuto-generatedmethodstub
StringElementnewe=(StringElement)otherElement;


return(str.compareTo(newe.str));
}

/*(non-Javadoc)
*@seeDataElement#makeCopy(DataElement)
*/
publicvoidmakeCopy(DataElementotherElement){
//TODOAuto-generatedmethodstub
StringElementnewe=(StringElement)otherElement;
str=newe.str;
}

/*(non-Javadoc)
*@seeDataElement#getCopy()
*/
publicDataElementgetCopy(){
//TODOAuto-generatedmethodstub

StringElementothere=newStringElement();
othere.str=str;
returnothere;

}

publicStringtoString(){
returnstr;
}
}

已经定义好了数据类型,所以list的数据类型我们就可以定义为DateElement[]了,这样就可以包括所以你想要的了,只要你在用的时候定义一个DataElement的子类就行了,这正是java继承的精髓所在.我们接着定义ArrayListClass类:

protectedintlength;
protectedintmaxSize;
protectedDataElement[]list;这就是它的所有域了.

接下来就是它的方法了,我们对表的操作应该有很多种,比如插入、查询、删减等等,我们要逐个的实现,具体方法不再赘述,且看最后完成代码

publicabstractclassArrayListClass{
//fields
protectedintlength;
protectedintmaxSize;
protectedDataElement[]list;

//defaltconstructors
publicArrayListClass(){
length=0;
maxSize=100;
list=newDataElement[maxSize];
}
//constructors
publicArrayListClass(intsize){
if(size<=0){
System.err.println("Thearrysizemustbepositive.Creatinganarrayofsize100.");
maxSize=100;
}
else
maxSize=size;
length=0;
list=newDataElement[maxSize];
}
publicArrayListClass(ArrayListClassotherList){
maxSize=otherList.maxSize;
length=otherList.length;
list=newDataElement[maxSize];
for(inti=0;i<length;i++){
list[i]=otherList.list[i].getCopy();
}
}

//methods
publicbooleanisEmpty(){
return(length==0);
}
publicbooleanisFull(){
return(length==maxSize);
}
publicintlistSize(){
returnlength;
}
publicintmaxListSize(){
returnmaxSize;
}
publicvoidprint(){
for(inti=0;i<length;i++){
System.out.print(list[i]+"");
}
System.out.println();
}
publicbooleanisItemAtEqual(intlocation,DataElementitem){
return(list[location].equals(item));
}
publicvoidinsrtAt(intlocation,DataElementinsertItem){
if(location<0||location>+maxSize){
System.out.println("Thepositionoftheitemtobeinsertedisoutofrange!!");
}
else
if(length>=maxSize)
System.err.println("Can'tinsertinafulllist!!");
else{
for(inti=length;i>location;i--){
list[i]=list[i-1];
}
list[location]=insertItem.getCopy();
length++;
}
}
publicvoidinsertEnd(DataElementinsertItem){
if(length>=maxSize){
System.err.println("Can'tinsertinafulllist!!");
}

else{
list[length]=insertItem.getCopy();
length++;
}
}
publicvoidremoveAt(intlocation){
if(location<0||location>=length){
System.err.println("Thelocationyouwanttoremoveisoutofrange!!");
}
else{
for(inti=location;i<length-1;i++){
list[i]=list[i+1];
}
list[length]=null;
length--;
}
}
publicDataElementretrieveAt(intlocation){
if(location<0||location>=length){
System.err.println("Thelocationofitemtoberetrievedisoutofrange!!");
returnnull;
}
else{
returnlist[location].getCopy();
}
}
publicvoidreplacAt(intlocation,DataElementrepItem){
if(location<0||location>=length)
System.out.println("Thepositionofitemtobereplacedisoutofrange!!");
else
list[location]=repItem.getCopy();
}
publicvoidclearList(){
for(inti=0;i<length;i++){
list[i]=null;
}
length=0;
System.gc();
}
publicvoidcopyList(ArrayListClassotherList){
if(this!=otherList){
for(inti=0;i<length;i++)
list[i]=null;
System.gc();
maxSize=otherList.maxSize;
length=otherList.length;
list=newDataElement[maxSize];

for(intj=0;j<length;j++)
list[j]=otherList.list[j].getCopy();
}
}
publicabstractintseqSearch(DataElementseqItem);
publicabstractvoidinsert(DataElementinsertItem);
publicabstractvoidremove(DataElementremoveItem);
}
看到代码的最后你回发现这个类其实是一个抽象类,为什么要这样定义呢?之所以这样我们是为了针对不同是类型:顺序表和非顺序表.不难想象他们的一些方法是存在差异的,先看一下非顺序表:

publicclassUnorderedArrayListextendsArrayListClass{

/**
*
*/
publicUnorderedArrayList(){
super();
//TODOAuto-generatedconstructorstub
}

/*(non-Javadoc)
*@seeArrayListClass#seqSearch(DataElement)
*/
publicintseqSearch(DataElementseqItem){
//TODOAuto-generatedmethodstub
intloc;
booleanfound=false;

for(loc=0;loc<length;loc++)
if(list[loc].equals(seqItem))
{
found=true;
break;
}
if(found)
returnloc;
else
return-1;
}

/*(non-Javadoc)
*@seeArrayListClass#insert(DataElement)
*/
publicvoidinsert(DataElementinsertItem){
//TODOAuto-generatedmethodstub
intloc;
if(length==0)
list[length++]=insertItem.getCopy();
else
if(length==maxSize)
System.err.println("Can'tinsertinafulllist!!");
else{
loc=seqSearch(insertItem);

if(loc==-1)
list[length++]=insertItem.getCopy();
else
System.err.println("Theitemtobeinsertedisallreadyinthelist!!");

}
}

/*(non-Javadoc)
*@seeArrayListClass#remove(DataElement)
*/
publicvoidremove(DataElementremoveItem){
//TODOAuto-generatedmethodstub
intloc;

if(length==0)
System.err.println("Can'tdeletefromaemptylist!!");
else{
loc=seqSearch(removeItem);
if(loc!=-1)
removeAt(loc);
else
System.err.println("Theitemtobedeletedisnotinthelist!!");
}

}

}

就是这么简单!!相信顺序表也可以轻松高顶了.
分享到:
评论

相关推荐

    Java基础-模拟HashMap集合(基于数组和链表) 数组和链表.pdf

    Java基础-模拟HashMap集合(基于数组和链表) 数组和链表.pdf

    数据结构-从应用到实现 (java版)

    主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例,递归详解,二叉查找树和AVL树,堆、散列表和排序以及图论等。对于每一种数据结构的性质和用途,《计算机...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Java-LeetCode数组经典解法解析.pptx.pptx

    数组是Java中一种重要的数据结构,用于存储相同类型的元素,具有连续的内存空间和固定的容量。 数组的创建和初始化 在Java中,可以通过声明和赋值两种方式来创建和初始化数组,其中声明确定了数组的类型和名称,而...

    基于JAVA实现的常用数据结构代码,JAVA实现复杂度、动态数组、链表、栈、队列、二叉搜索树等

    基于JAVA实现的常用数据结构代码,JAVA实现复杂度、动态数组、链表、栈、队列、二叉搜索树等

    Java数据结构和算法中文第二版(1)

    Java数据结构和算法中文第二版(1) Java数据结构和算法中文第二版(2) 【内容简介】 本书可帮助读者: 通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择...

    Java数据结构与算法中的源代码和applet - 站长下载

    书名:数据结构Java版 图书编号:2086963 出版社:清华大学 定价:118.0 ISBN:730213544 作者:(美)福特(Ford,W.H.),(美)托普(Topp,W.R.) 著,梁志敏 译 出版日期:2006-11-11 版次: 开本: 简介: 本书...

    datastructure:基于java语言的数据结构及算法实现

    玩儿转数据结构更多相关代码仓, 代码仓:源码目录第一章 数组1-1 使用Java中的数组1-2 二次封装属于我们自己的数组1-3 向数组中添加元素1-4 数组中查询元素和修改元素1-5 包含,搜索和删除1-6 使用泛型1-7 动态数组第...

    JS-algorithms-and-data-structures:出于学习目的,在JS中实现各种算法和数据结构

    用Java语言实现的随机算法和数据结构,只是为了好玩。 探索不同的编码样式,因此文件之间的编码样式可能会有很大差异。 实施的: 数据结构: 单链表 双链表 堆栈-基于阵列的固定容量 堆栈-基于列表 两栈一阵列 ...

    Java数据结构和算法中文第二版(2)

    Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? ...

    Java-Library:基于数组的容器类库的实现

    Java库项目描述实现一个基于数组的容器类Library,并使用它来保存该图书馆拥有的书籍清单的信息。 Library类的一个实例是一个可扩展的bag数据结构,其初始容量为4,并在容量满时自动将其容量增加(增加)4。终极成绩...

    基于Java的数据结构和算法.zip

    算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)...

    VTK User's Guide(中文完整版)

    Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4章 基础 4.1 创建1个简单的模型-------------------------------------------------------------------------24 ...

    基于java语言的数据结构及算法实现,LeetCode算法示例.zip

    算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,...

    leetcode摇摆-data-structure:java数据结构

    此项目是基于java语言的关于数据结构的代码实现,包含所有经典数据结构算法,并且注释完善,非常适合了解和学习数据结构。另外包含了一个联系人存储工具(phonebook),它由swing展示,并应用了数据结构算法的相关概念...

    magic-api 是一个基于Java的接口快速开发框架,通过magic-api提供的UI界面完成编写接口.zip

    因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向...

    Java面试宝典-经典

    11、有数组a[n],用java代码将数组元素顺序颠倒 80 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java集合-ArrayDeque的使用

    ArrayDeque 是Java中的双向队列(deque)实现,它基于数组实现并可以高效地在两端进行插入和删除操作。 以下是关于 ArrayDeque 的一些重要信息: 双向队列特性:ArrayDeque 支持在队列的两端进行元素的插入和删除...

Global site tag (gtag.js) - Google Analytics