/*
* 创建日期 2005-2-5
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
/**
* @author bitan
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class Test4 {
class Digital {
private final int initSize;
private final int increase;
private Object[] arrays;
private int items;
private int capacity;
public void removeAll(int offset, int length) {
if (offset < 0 || length < 0 || (offset + length) > items)
throw new IllegalArgumentException("Arguments may be illegal.");
items -= length;
capacity -= ((capacity -items) / increase) * increase;
Object[] temps = new Object[capacity];
for (int i = 0; i < offset; i++) {
temps[i] = arrays[i];
}
for (int i = offset; i < items; i++) {
temps[i] = arrays[i + length];
}
arrays = temps;
}
public void addAll(Object[] os) {
addAll(items, os);
}
public void addAll(Digital d) {
addAll(items, d);
}
public void addAll(int index, Object[] os) {
if (index < 0) throw new IllegalArgumentException("Arguments may be illegal.");
if (os == null || os.length == 0) {
return;
}
items += os.length;
if (items > capacity) {
capacity += (((items - capacity)) / increase + 1) * increase;
}
Object[] temps = new Object[capacity];
for (int i = 0; i < index; i++) {
temps[i] = arrays[i];
}
for (int i = index, j = 0; j < os.length; i++, j++) {
temps[i] = os[j];
}
for (int i = (index + os.length), j = index; i < items; i++, j++) {
temps[i] = arrays[j];
}
arrays = temps;
}
public void addAll(int index, Digital d) {
addAll(index, d.toArrays());
}
public Object[] toArrays() {
Object[] temps = new Object[items];
for (int i = 0; i < items; i++) {
temps[i] = arrays[i];
}
return temps;
}
public void removeAll() {
init();
}
private void init() {
arrays = new Object[initSize];
items = 0;
capacity = initSize;
}
public int getCapacity() {
return capacity;
}
public int size() {
return items;
}
public Digital() {
initSize = 4;
increase = 2;
init();
}
public Digital(int initSize, int increase) {
if (initSize < 0 || increase <= 0)
throw new IllegalArgumentException("arguments may be illegal.");
this.increase = increase;
this.initSize = initSize;
init();
}
public Object elementAt(int index) {
if (index < 0 || index > this.items) {
throw new IllegalArgumentException("arguments may be illegal.");
}
return this.arrays[index];
}
public Object getFirstElement() {
return arrays[0];
}
public Object getLastElement() {
return arrays[items-1];
}
public void removeLastElement() {
removeElement(items - 1);
}
public void removeFirstElement() {
removeElement(0);
}
public void removeElement(int index) {
if (index < 0 || index > this.items) {
throw new IllegalArgumentException("arguments may be illegal.");
}
while(index < items -1) {
arrays[index] = arrays[index + 1];
index++;
}
arrays[index] = null;
items--;
if (items % increase == 0) {
this.capacity -= increase;
Object[] temps = new Object[capacity];
for (int i = 0; i < items; i++) {
temps[i] = arrays[i];
}
arrays = temps;
}
}
public void insertElement(int index, Object o) {
if (o == null || index < 0 || index > items)
throw new IllegalArgumentException("Argument may be illegal.");
items++;
if (items > capacity)
capacity += increase;
Object[] temps = new Object[capacity];
for (int i = 0; i < index; i++ ) {
temps[i] = arrays[i];
}
temps[index] = o;
for (int i = (index + 1); i < items; i++) {
temps[i] = arrays[i - 1];
}
arrays = temps;
}
public void addElement(Object o) {
insertElement(items, o);
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(this.getClass().getName() + " : (size=" + items + ", capacity=" + capacity + ") [");
for (int i = 0; i < this.items; i++) {
sb.append(arrays[i]);
if (i != items -1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
public static void main(String[] args) {
Test4 t4 = new Test4();
Digital d = t4.new Digital(3,2);
Digital d2 = t4.new Digital(6, 3);
String[] sArr = new String[8];
for (int i = 0; i < sArr.length; i++) {
sArr[i] = "aaaa" + i;
}
for (int i = 0; i < 4; i++) {
d.addElement("bbbb" + i);
}
d2.addAll(sArr);
System.out.println(d + "\n" + d2);
d2.addAll(2, d);
System.out.println(d2);
d2.removeAll(5, 4);
System.out.println(d2);
System.out.println("first=" + d2.getFirstElement() + ", last=" + d2.getLastElement() + ", index[5]=" + d2.elementAt(5));
d2.insertElement(7, "cccc0");
System.out.println(d2);
}
}
结果:
Test4$Digital : (size=4, capacity=5) [bbbb0, bbbb1, bbbb2, bbbb3]
Test4$Digital : (size=8, capacity=9) [aaaa0, aaaa1, aaaa2, aaaa3, aaaa4, aaaa5, aaaa6, aaaa7]
Test4$Digital : (size=12, capacity=15) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, bbbb3, aaaa2, aaaa3, aaaa4, aaaa5, aaaa6, aaaa7]
Test4$Digital : (size=8, capacity=9) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, aaaa5, aaaa6, aaaa7]
first=aaaa0, last=aaaa7, index[5]=aaaa5
Test4$Digital : (size=9, capacity=9) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, aaaa5, aaaa6, cccc0, aaaa7]
结论:
一、设计线性表时,最复杂的是按索引增加和删除方法,最简单的是查找方法。
二、当实现几个功能类似的方法时,应该优先实现有索引参数的方法。然后,无索引参数的方法可以简单调用有索引参数的方法。
分享到:
相关推荐
在这个例子中,我们看到的是顺序线性表,也就是数组实现的线性表。顺序线性表的操作包括初始化、销毁、清空、判断是否为空、获取长度、获取指定位置的元素、查找特定元素、比较元素以及找到元素的前驱。 **初始化...
类模板可以用来创建自定义线性表,提供特定的行为和操作,比如插入、删除、查找等。\n\n**通用算法**\n基于模板的通用算法,如STL(Standard Template Library)中的`std::sort`、`std::find`等,能够对多种类型的...
在编程领域,数据结构是构建高效算法的基础,而线性表、栈和队列是最基本且重要的数据结构。本文将详细探讨如何在Java或C#等支持泛型的语言中,为JWList和JWArray类加入泛型支持,以实现更加灵活和强大的功能。 ...
在C语言中,由于没有内置的数据结构来直接表示线性表,我们通常使用结构体和指针来创建自定义的数据结构,即链表。 首先,我们来看代码中的`typedef`关键字。`typedef`用于为现有的数据类型创建一个新的名字,这里...
题目中给出的例子是一个具有五个元素的线性表L={23, 17, 47, 05, 31},它以链式方式存储在100到119号地址空间中。每个节点由数据(占用2个字节)和指针(占用2个字节)组成。根据链表的定义,节点的排列顺序应该是:...
在这个例子中,根据线性表是否为空,提供相应的销毁提示信息。 下面是一个使用示例,创建了一个包含5个元素的线性表,并进行了查找操作。这段代码展示了如何实例化`linearList`类,以及如何调用其方法进行线性表...
这篇代码实现了一个简单的程序,能够将一种称为"魔王语言"的自定义编码转换为人类可读的语言,即英语和汉语。这个程序主要使用了栈、队列和线性表(链表)三种数据结构来完成翻译过程。 首先,程序定义了三个结构体...
1. **顺序表**:顺序表是最简单的线性表实现,它使用数组来存储元素。在数组中,元素按照它们在表中的位置依次存储。优点是访问速度快,因为数组的随机访问特性;缺点是插入和删除操作可能导致大量元素的移动,效率...
此外,Flex Chart还支持各种其他类型的图表,如柱状图、饼图、面积图等,以及丰富的自定义选项,如添加图例、轴标签、数据提示等,以满足不同需求。 在压缩包文件"flex chart"中,可能包含了示例代码、FLA文件...
通讯录管理是一个实际应用的例子,使用线性表来存储和管理通讯录数据。每个联系人的数据包括ID、姓名、性别、电话和地址。实现通讯录管理需要实现增、删、改、查等功能,以及简单的菜单交互,让用户通过输入命令选择...
线性表是一种简单的数据结构,由有限个相同类型元素组成,元素间存在一对一的关系。在Java中,我们可以通过数组来实现线性表。`LineList` 类就是这样一个例子,它有一个 `int` 类型的数组 `data` 和一个表示表长度的...
通过对 `LocateElem` 和 `ListTraverse` 两个函数的学习,我们可以了解到在处理线性表时如何灵活运用自定义函数来实现复杂的逻辑操作。这种编程技巧不仅适用于 C 语言,也广泛应用于其他编程语言中。希望本文能帮助...
单链表中的每个节点包含一个数据元素(在这个例子中是人员记录)以及一个指向下一个节点的指针。 【约瑟夫环】 约瑟夫环问题是一个经典的计算机科学问题,涉及到链表操作和循环。问题描述中,n个人围成一个圈,按照...
- 讨论了异常处理的基本原理,包括`try-catch-finally`语句的使用,以及如何自定义异常类。 ##### 1.4 Java与指针 - 虽然Java不支持传统的指针操作,但本节简要介绍了Java中的引用类型,并探讨了其与传统指针之间...
- **实现**:利用数组或字符串等数据结构来存储大数,并自定义加减乘除等运算规则。 ### 知识点五:贪心算法 #### 5.1 贪心的原理 - **定义**:在每一步选择中都采取当前状态下最好或最优的选择。 - **特点**:...
在这个例子中,数组的基本操作有初始化(Initiate)、获取长度(Size)、设置元素(Set)和获取元素(Get)。这些操作在C++中可以通过自定义的数组类来实现。 在C++中,我们可以创建一个模板类`Array`来模拟数组的...
线性结构的例子包括数组和链表,其中元素之间存在顺序关系。非线性结构则包含树形结构、图结构等,它们的关系更为复杂。 存储结构则是逻辑结构在计算机内存中的实现方式。常见的存储结构有顺序存储和链式存储。顺序...