`
fly_hyp
  • 浏览: 305767 次
  • 性别: 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;
	}	
}

 

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

分享到:
评论
31 楼 lovejavaei 2009-05-19  
sdh5724 写道
JE现在的规矩是:
1。 发表代码实现为新手
2。 有类似实现是重复造轮子
3。 业务无视技术

楼主,小心了。


搂住的精神绝对可嘉,值得发扬,痛恨那些再跟着瞎说“重复造轮子”的人,有本事,你造一个!从回复的帖子来看,相当一部分人不知道数据结构的东西,建议不懂数据结构没有深入研究过collection的,不要瞎评论。

对楼住代码给点看法
单纯的线性表要实现边插入边排序效率低下,不管是数组还是链表,因为数组做插入效率低,而链表做遍历效率低。

所以jdk里用的是红黑树来实现的,这是一种复杂的树结构,建议研究一下
30 楼 sdh5724 2009-05-18  
JE现在的规矩是:
1。 发表代码实现为新手
2。 有类似实现是重复造轮子
3。 业务无视技术

楼主,小心了。
29 楼 captmjc 2009-05-17  
LZ的类毫无意义。LZ对List的认识有问题。
首先,没有理解接口(也包括抽象类)是一种契约,而不单单是把这个接口中的方法从public void foo();变成public void foo() {...}。LZ的所谓SortedArrayList一个错误的List实现,它违反了java.util.List中对add方法的约定——新添加的内容,位于List的最后(参照List的javadoc),进而导致get/addAll这样的方法也与List中的约定的不一致。

第二,建议LZ深入理解一下Java Collection Framework的设计理念。而且,LZ可以实际想像一下,Collections.sort可以在任何时候满足LZ的要求。而反过来,LZ的类,在绝大多数时候的效率都差很多,而且是差在毫无意义的地方。

应用LZ"SortedArrayList是一直保持排序状态的List和调用sort方法是不一样的。"
其实,实际使用的时候,很少会有一边插入,一边排序的要求,往往都是一次性往容器中添加N个元素,然后得到排序结果。

此外,读一下Thinking in Java这样的书,里面有关于ArrayList/Vector vs LinkedList(当然,包括其他Map、Set的比较)。(可能)需要频繁插入操作的时候,应当使用基于列表的LinkedList,因此,不考虑其他因素,LZ的arr对象应当使用LinkedList。
28 楼 jzc928 2009-05-16  
二分查找如果不用递归实现是不是会好点。
27 楼 fly_hyp 2009-05-14  
发了这个帖子收获还是挺大的。

修改了范型的使用代码。

对于SortedArraySet这个名字我还是比较满意的。
这个数据结构有如下特点

1.具有set所有的功能
2.插入速度慢
3.查询速度快,和 hash、tree是一个级别的
4.占用内存少
5.元素排序的(象一个优先级队列)
6.方面查找前后元素(处理队列时,可以查询前后的情况)

26 楼 Feiing 2009-05-13  
fly_hyp 写道
jojo_java 写道
确实没必要!!!重复制造轮子,闭门造车!!!


各种数据结构有特有的用途 SortedArraySet 具有找前后元素快的特点




不重复,排序, 能前后查找 你应该用 java.util.LinkedHashSet
25 楼 java.lang.Object 2009-05-13  
prince1209 写道
TreeSet  和TreeMap的  实现肯定不一样额
TreeSet 是SortedSet的一个实现类  是一个有序集合 默认按升序排的
TreeMap  是一个键值队  (key-value)

你这样说肯定是没看源码,想当然的认为,其实TreeSet里面就有一个TreeMap。它就是基于TreeMap来实现的。
24 楼 java.lang.Object 2009-05-13  
没看出有什么闪光点,但是楼主的精神是可嘉的
23 楼 prince1209 2009-05-09  
TreeSet  和TreeMap的  实现肯定不一样额
TreeSet 是SortedSet的一个实现类  是一个有序集合 默认按升序排的
TreeMap  是一个键值队  (key-value)
22 楼 cats_tiger 2009-05-09  
不是不欣赏算法,而是反对重复造轮子。有很多可排序的Collection,google code有,apache commons也有。
21 楼 qamer 2009-05-07  
Middle二分
20 楼 fly_hyp 2009-05-06  
jojo_java 写道
确实没必要!!!重复制造轮子,闭门造车!!!


各种数据结构有特有的用途 SortedArraySet 具有找前后元素快的特点


19 楼 jojo_java 2009-05-06  
确实没必要!!!重复制造轮子,闭门造车!!!
18 楼 fly_hyp 2009-05-06  
想了几天终于想到了确切的名字了 SortedArraySet
17 楼 vlinux 2009-05-05  
楼上.Set和List的区别还是很明显的吧...

汗,我的错,没注意看注释

# /**
#  * 其中的元素的唯一的,其中的元素是排序的(从小到大)
#  * @author hyp
#  * @param <E>
#  */ 

楼主的确应该是Set..
16 楼 kaipingk 2009-05-05  
多此一举,用treeset不就得了
15 楼 fly_hyp 2009-05-05  
thanks,
应该写成这样。
E extends Comparable<E>
14 楼 vlinux 2009-05-05  
既然你用了泛型,要不你就这样进行定义<E extends Comparable>,要不你就在程序里面进行判断,否则我一旦掉用add方法就抛出异常那就没意思了
13 楼 fly_hyp 2009-05-05  
vlinux 写道
呵呵,这么多人投新手帖,我觉得是和JavaEye上大多是技术方面特长,而不欣赏算法有关。


这里有个小问题

#             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); 
#             }

你就那么自信的肯定E是实现了Comparable接口的么,呵呵



其实这是约定,能放入这个List的对象必须实现Comparable接口,不然不能排序,大部分系统原生对象如Integer Float String 等都实现这个接口。jdk的其他数据接口类也是这样使用的。
12 楼 vlinux 2009-05-05  
呵呵,这么多人投新手帖,我觉得是和JavaEye上大多是技术方面特长,而不欣赏算法有关。


这里有个小问题

#             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); 
#             }

你就那么自信的肯定E是实现了Comparable接口的么,呵呵

相关推荐

    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