`
fly_hyp
  • 浏览: 305803 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

写了一个list类SortedArrayList不知该叫什么名字

    博客分类:
  • Java
阅读更多

写了一个SortedArrayList类我觉得应该是有普遍的用途(通用类),想取一个更好一点的名字,有兴趣的帮我想想。代码无偿奉献。哈哈。

我现在的用途是存放Id,其中没有重复数据,方便查找前后关系。

 

/**
 * 其中的元素的唯一的,其中的元素是排序的(从小到大)
 * @author hyp
 * @param <E>
 */
public class SortedArrayList<E> implements List<E> {
	ArrayList<E> arr;
	public SortedArrayList() {
		arr = new ArrayList<E>();
	}
	public SortedArrayList(int initialCapacity) {
		arr = new ArrayList<E>(initialCapacity);
	}
	@SuppressWarnings("unchecked")
	private void doAdd(E obj, int startPos, int endPos) {
		int dPos = endPos - startPos;
		if (dPos < 1) {
			// 初始情况
			arr.add(obj);
		} else if (dPos == 1) {
			E tmpObj = arr.get(startPos);
			if (((Comparable) tmpObj).compareTo(obj) > 0) {
				arr.add(startPos, obj);
			}
			if (((Comparable) tmpObj).compareTo(obj) < 0) {
				arr.add(startPos + 1, obj);
			}
		} else {
			int midPos = (endPos + startPos) / 2;
			E tmpObj = arr.get(midPos);
			if (((Comparable) tmpObj).compareTo(obj) > 0) {
				doAdd(obj, startPos, midPos);
			}
			if (((Comparable) tmpObj).compareTo(obj) < 0) {
				doAdd(obj, midPos, endPos);
			}
		}
	}
	@SuppressWarnings("unchecked")
	private int doFind(E obj, int startPos, int endPos) {
		int dPos = endPos - startPos;
		if (dPos < 1) {
			// 初始情况
			return -1;
		} else if (dPos == 1) {
			E tmpObj = arr.get(startPos);
			if (tmpObj.equals(obj)) {
				return startPos;
			}
		} else {
			int midPos = (endPos + startPos) / 2;
			E tmpObj = arr.get(midPos);
			if (((Comparable) tmpObj).compareTo(obj) > 0) {
				return doFind(obj, startPos, midPos);
			} else if (((Comparable) tmpObj).compareTo(obj) < 0) {
				return doFind(obj, midPos, endPos);
			} else {
				return midPos;
			}
		}
		return -1;
	}
	@Override
	public boolean add(E obj) {
		doAdd(obj, 0, arr.size());
		return true;
	}
	@SuppressWarnings("unchecked")
	@Override
	public boolean remove(Object obj) {
		int index = doFind((E) obj, 0, arr.size());
		if (index >= 0) {
			arr.remove(index);
			return true;
		}
		return false;
	}	
}

 

以上贴出来的是简化版本,方便浏览,附件中是完全版本。

分享到:
评论
11 楼 keating 2009-05-05  
Xorcerer 写道
好奇一下,ArrayList不是链表吗?而Object[]不是数组吗?
如果以上都肯定的话,那么为什么ArrayList内部是Object[]?扩容时怎么操作?全部复制一份?还是每次申请大片的空间,然后拼接那种。

我认为啊,这个数据集结构都是数组写出来的吧。扩充时判断一下数组大小就行了。以前一本《探秘java》里看过。
10 楼 guooscar 2009-05-05  
fly_hyp 写道
guooscar 写道

TreeSet 和你这个类功能一样吧?

仔细考虑了一下这个实现和TreeSet TreeMap等还是不一样,他获得子序列的算法复杂度为 O(0) 常数时间。


那还有必要写这个吗?
9 楼 fly_hyp 2009-05-05  
guooscar 写道

TreeSet 和你这个类功能一样吧?

仔细考虑了一下这个实现和TreeSet TreeMap等还是不一样,他获得子序列的算法复杂度为 O(0) 常数时间。
8 楼 kimmking 2009-05-04  
LinkedList才是链表。
ArrayList没有链,就是Array而已。
7 楼 Xorcerer 2009-05-04  
好奇一下,ArrayList不是链表吗?而Object[]不是数组吗?
如果以上都肯定的话,那么为什么ArrayList内部是Object[]?扩容时怎么操作?全部复制一份?还是每次申请大片的空间,然后拼接那种。
6 楼 fly_hyp 2009-05-03  
kimmking 写道

ArrayList&lt;E&gt; arr换成一个Object[]然后使用二分法可以提高效率。

Object[]是会快一点,应该是差不多的,ArrayList内部也是Object[]
5 楼 fly_hyp 2009-05-03  
guooscar 写道

TreeSet 和你这个类功能一样吧?

刚刚仔细看了一遍TreeSet的功能,应该是一样的,谢谢了。不过可能性能上有少量差别
4 楼 fly_hyp 2009-05-03  
aquleo 写道

说真的,我觉得这个类没有太大必要,如果真想做排序还不如直接用Collections的sort方法...

SortedArrayList是一直保持排序状态的List和调用sort方法是不一样的。
3 楼 aquleo 2009-05-02  
说真的,我觉得这个类没有太大必要,如果真想做排序还不如直接用Collections的sort方法...
2 楼 guooscar 2009-05-02  
TreeSet 和你这个类功能一样吧?
1 楼 kimmking 2009-05-02  
ArrayList<E> arr换成一个Object[]然后使用二分法可以提高效率。

相关推荐

    Java将2个List集合合并到一个List里面并排序工具类

    Java将2个List集合合并到一个List里面并排序工具类 1、Java编程资源,定义了一个名为`ListMerger`的工具类,主要包含一个名为`mergeAndSortLists`的静态方法。此方法用于将两个已经根据时间顺序排列的List合并成一...

    创建一个数据类型为T的链表类模板List,实现以下成员函数的模拟测试.cpp

    2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数...

    基于java8新特性+反射机制实现list不同实体类互转.zip

    这个压缩包文件“基于java8新特性+反射机制实现list不同实体类互转.zip”提供了一种解决方案,它利用了Java 8的新特性和反射机制来实现这种转换,并将这个功能封装为一个工具类。 首先,Java 8引入了许多新特性,...

    list转树形结构工具类

    这个类通常包含一个标识符(如ID)、数据字段以及对子节点的引用(例如,一个List或另一个自定义的节点类)。 2. 创建根节点:遍历List,找到合适的元素作为树的根节点。根节点没有父节点,但可能有多个子节点。 3...

    list类实现文件读写

    本程序没有使用类,事实上将下面的函数封装到类中可以实现一样的功能。 包含调试工程 方便起见,直接在main函数中写好这些程序。 使用了系统自带的list类。 本程序没有进行错误的捕捉与处理,例如在没有open的情况...

    java中,list集合数据导出到excel表格通用工具类

    在Java编程中,将List集合数据导出到Excel表格是一个常见的需求,特别是在数据分析、报表生成或数据导出等场景。本实例提供了一个通用工具类,能够处理多种不同类型的对象集合,实现了最大化的通用性,使得开发者...

    java计算同一个list中是否有相同的值

    如果找到,则将该元素添加到一个新的列表 `list2` 中,并从原列表 `list` 中移除它。 4. **计数**:计算 `list2` 的大小并加上 1(因为还需要考虑当前元素本身),然后将其与之前记录的最大重复次数 `num` 进行比较...

    List转换为List

    4. **将Map添加到新的List中**:每当创建完一个Map后,将其添加到一个新的List集合中。 5. **返回新的List**:最终返回包含Map对象的List集合。 #### 示例代码: 假设有一个AnnouncementBean类,包含属性:actid...

    两个list比较 取不同的对象

    本文将详细探讨如何通过一个示例代码来理解如何比较两个`List`并提取出不同的对象。 #### 核心知识点解析 1. **列表(List)的基础操作**: - `List`是一种常用的数据结构,在Java中,`List`接口是`Collection`框架...

    C++ 读、写文件练习 包含list类实现

    本项目名为“C++ 读、写文件练习 包含list类实现”,主要涵盖了两个关键知识点:C++中的文件I/O操作以及C++标准库中的`std::list`容器的使用。 首先,我们来探讨C++的文件I/O操作。C++提供了丰富的流(stream)类库...

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    自己写的一个listCtrl 可编辑单元格

    `ListCtrl` 是Windows API中的一个窗口类,它的官方名称是`LV_CLASS`,在MFC中,我们通常使用`CListCtrl`类来操作它。`ListCtrl`通常用于展示多列数据,并且可以支持各种视图模式,如报告视图、小图标视图、大图标...

    c# List类排序方法

    在C#中,`List&lt;T&gt;`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以采用多种不同的策略和技术。本篇文章将详细介绍`List&lt;T&gt;`的...

    java XML转成LIST可以转成指定的类数组

    首先,我们需要创建一个对应的Java类,该类的字段将与XML元素对应。 3. **创建Java模型类** 假设我们的XML文件具有以下结构: ```xml &lt;name&gt;Item1 &lt;description&gt;Description1 &lt;name&gt;Child1 ...

    list类全部实现

    例如,我们可以创建一个`Node`类表示链表节点,包含数据和两个指针域,然后创建一个`LinkedList`类,包含头节点,并实现插入、删除和遍历的方法。在`test6`这个文件中,可能包含了这些类的实现代码,供学习和参考。 ...

    std::List类的遍历获得元素的操作二法

    在C++标准库中,`std::list`是一种双链表容器,它提供了一种高效的方式来存储和操作序列数据。由于`std::list`不是随机访问容器,因此它不支持像数组那样的通过索引直接访问元素(如`[]`运算符)。但是,`std::list`...

    java 使用Collections类对List的排序操作

    在Java编程语言中,`Collections` 类是 `java.util` 包中的一个工具类,它提供了许多静态方法,用于操作各种集合,特别是列表(List)。本文将深入探讨如何使用 `Collections` 类对 List 进行排序操作。 首先,让...

    list嵌套list例子

    当我们谈论“list嵌套list”时,这意味着在一个列表内部包含了一个或多个列表,这样的结构可以创建出多维的数据集合。这种数据结构在处理表格数据、矩阵或树形结构时特别有用。 下面我们将详细探讨如何创建、操作和...

    webservice获取List案例

    6. **文件08_01_webservice**:这个名字可能表示这是一个关于第八章第一节的WebService示例。这个文件可能是一个包含源代码、配置文件和其他相关资源的项目文件夹。要学习这个案例,你需要解压文件并查看其中的代码...

    ListCtrl控件排序类及演示程序

    这个“ListCtrl控件排序类及演示程序”是针对开发者的一个资源,它提供了一种方法来实现ListView控件中数据的动态排序功能,特别适用于那些需要频繁更新和排序列表的应用。 ListCtrl控件排序类是程序中一个关键的...

Global site tag (gtag.js) - Google Analytics