- 浏览: 307761 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
Xiaoanemy:
我怎么就是不行Error opening zip file o ...
javarebel不用再反复重启tomcat -
fly_hyp:
lvwenwen 写道相对hessian来说有其他什么优势?应 ...
一个很牛的架构组件(Dubbo) -
lvwenwen:
相对hessian来说有其他什么优势?
一个很牛的架构组件(Dubbo) -
dj4307665:
想了解下,相对hessian来说有其他什么优势?
一个很牛的架构组件(Dubbo) -
fly_hyp:
sweat89 写道怎么解决的啊?忘了。怎么说呢?自己写的代码 ...
Spring之恶心错误记录
写了一个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; } }
以上贴出来的是简化版本,方便浏览,附件中是完全版本。
- SortedArrayList.rar (1.2 KB)
- 下载次数: 143
评论
31 楼
lovejavaei
2009-05-19
sdh5724 写道
JE现在的规矩是:
1。 发表代码实现为新手
2。 有类似实现是重复造轮子
3。 业务无视技术
楼主,小心了。
1。 发表代码实现为新手
2。 有类似实现是重复造轮子
3。 业务无视技术
楼主,小心了。
搂住的精神绝对可嘉,值得发扬,痛恨那些再跟着瞎说“重复造轮子”的人,有本事,你造一个!从回复的帖子来看,相当一部分人不知道数据结构的东西,建议不懂数据结构没有深入研究过collection的,不要瞎评论。
对楼住代码给点看法
单纯的线性表要实现边插入边排序效率低下,不管是数组还是链表,因为数组做插入效率低,而链表做遍历效率低。
所以jdk里用的是红黑树来实现的,这是一种复杂的树结构,建议研究一下
30 楼
sdh5724
2009-05-18
JE现在的规矩是:
1。 发表代码实现为新手
2。 有类似实现是重复造轮子
3。 业务无视技术
楼主,小心了。
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。
首先,没有理解接口(也包括抽象类)是一种契约,而不单单是把这个接口中的方法从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.方面查找前后元素(处理队列时,可以查询前后的情况)
修改了范型的使用代码。
对于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 是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)
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..
汗,我的错,没注意看注释
# /**
# * 其中的元素的唯一的,其中的元素是排序的(从小到大)
# * @author hyp
# * @param <E>
# */
楼主的确应该是Set..
16 楼
kaipingk
2009-05-05
多此一举,用treeset不就得了
15 楼
fly_hyp
2009-05-05
thanks,
应该写成这样。
E extends Comparable<E>
应该写成这样。
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接口的么,呵呵
这里有个小问题
# 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接口的么,呵呵
这里有个小问题
# 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接口的么,呵呵
发表评论
-
为什么中文编程项目失败率特别高?
2017-06-11 10:58 431不少中文编程语言都是创造者一时热情。觉得发明很伟大,想当然的 ... -
阿里大数据架构
2014-06-26 10:16 764阿里大数据架构 -
JDI Java程序员的高级玩具
2013-12-30 10:03 1502JDI,Java程序员的高级玩 ... -
异构云操作系统需要具备的18总特性和3类支持
2013-12-24 14:07 1091什么是云操作系统? 相对于单机操作系统,网络操作系统。至少 ... -
安全云存储系统技术总结
2013-12-05 16:15 1050阅读了一下《计算机研究与发展-安全云存储系统与关键技 ... -
大型团队Java项目日志自由激活的设计
2013-11-25 13:40 858大型团队Java项目日志自由激活的设计 摘要: ... -
可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写
2013-11-05 17:04 884这句话我喜欢。 凡是可以用 JavaScrip ... -
评价挺高的Java Web Profile 开源工具 Jwebap
2013-11-04 09:19 744想法很不错,作者也很努力,评价也不错。不过从历史的角 ... -
playframework 非常不错的web开发框架
2013-09-18 15:34 909playframework 非常不错的web开发 ... -
knockoutjs 非常不错的js mvc 框架
2013-09-18 15:32 713knockoutjs 非常不错的js mvc 框架 ... -
一个企业级的自动化工具gradle
2013-09-02 16:08 817还没有用过,理念不错,我喜欢。值得研究一下。 ... -
activeJDBC现在很流行的一个JDBC应用
2013-09-02 16:05 896activeJDBC现在很流行的一个JDBC应用 ... -
如何解决 emma 在 JDK7 下 java.lang.ClassFormatError 错误
2013-09-02 16:04 770JVM 启动时可以加入 “-XX:-UseSplit ... -
10 个非常重要的 HotSpot JVM 参数
2013-08-17 20:42 8271) 跟 Java 堆大小相关的 JVM 内存参数 下 ... -
A JSP to print all the stacks
2013-06-19 17:29 880A JSP to print all the stacks ... -
Ubuntu11.10下解决 jmap等jdk工具attach pid错误
2013-05-13 18:05 8561.错误案例 java] view plaincop ... -
对Emma的使用进行一些总结
2013-01-06 17:47 1012对Emma的使用进行一些总结 写道 首先将 ... -
一个很牛的架构组件(Dubbo)
2012-12-27 17:52 2725这是一个在阿里内部广泛使用的,管理SOA组件间互相调用的基本框 ... -
Open Id and Open Auth
2011-05-31 10:00 1463Open Id and Open Auth 1.a ... -
redis 初学指导
2010-06-26 23:08 1349如果你初学或者对redis很有兴趣下面的文字可能会对你有帮助 ...
相关推荐
Java将2个List集合合并到一个List里面并排序工具类 1、Java编程资源,定义了一个名为`ListMerger`的工具类,主要包含一个名为`mergeAndSortLists`的静态方法。此方法用于将两个已经根据时间顺序排列的List合并成一...
2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数...
这个压缩包文件“基于java8新特性+反射机制实现list不同实体类互转.zip”提供了一种解决方案,它利用了Java 8的新特性和反射机制来实现这种转换,并将这个功能封装为一个工具类。 首先,Java 8引入了许多新特性,...
这个类通常包含一个标识符(如ID)、数据字段以及对子节点的引用(例如,一个List或另一个自定义的节点类)。 2. 创建根节点:遍历List,找到合适的元素作为树的根节点。根节点没有父节点,但可能有多个子节点。 3...
本程序没有使用类,事实上将下面的函数封装到类中可以实现一样的功能。 包含调试工程 方便起见,直接在main函数中写好这些程序。 使用了系统自带的list类。 本程序没有进行错误的捕捉与处理,例如在没有open的情况...
在Java编程中,将List集合数据导出到Excel表格是一个常见的需求,特别是在数据分析、报表生成或数据导出等场景。本实例提供了一个通用工具类,能够处理多种不同类型的对象集合,实现了最大化的通用性,使得开发者...
如果找到,则将该元素添加到一个新的列表 `list2` 中,并从原列表 `list` 中移除它。 4. **计数**:计算 `list2` 的大小并加上 1(因为还需要考虑当前元素本身),然后将其与之前记录的最大重复次数 `num` 进行比较...
4. **将Map添加到新的List中**:每当创建完一个Map后,将其添加到一个新的List集合中。 5. **返回新的List**:最终返回包含Map对象的List集合。 #### 示例代码: 假设有一个AnnouncementBean类,包含属性:actid...
本文将详细探讨如何通过一个示例代码来理解如何比较两个`List`并提取出不同的对象。 #### 核心知识点解析 1. **列表(List)的基础操作**: - `List`是一种常用的数据结构,在Java中,`List`接口是`Collection`框架...
本项目名为“C++ 读、写文件练习 包含list类实现”,主要涵盖了两个关键知识点:C++中的文件I/O操作以及C++标准库中的`std::list`容器的使用。 首先,我们来探讨C++的文件I/O操作。C++提供了丰富的流(stream)类库...
本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...
`ListCtrl` 是Windows API中的一个窗口类,它的官方名称是`LV_CLASS`,在MFC中,我们通常使用`CListCtrl`类来操作它。`ListCtrl`通常用于展示多列数据,并且可以支持各种视图模式,如报告视图、小图标视图、大图标...
在C#中,`List<T>`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以采用多种不同的策略和技术。本篇文章将详细介绍`List<T>`的...
首先,我们需要创建一个对应的Java类,该类的字段将与XML元素对应。 3. **创建Java模型类** 假设我们的XML文件具有以下结构: ```xml <name>Item1 <description>Description1 <name>Child1 ...
例如,我们可以创建一个`Node`类表示链表节点,包含数据和两个指针域,然后创建一个`LinkedList`类,包含头节点,并实现插入、删除和遍历的方法。在`test6`这个文件中,可能包含了这些类的实现代码,供学习和参考。 ...
在C++标准库中,`std::list`是一种双链表容器,它提供了一种高效的方式来存储和操作序列数据。由于`std::list`不是随机访问容器,因此它不支持像数组那样的通过索引直接访问元素(如`[]`运算符)。但是,`std::list`...
在Java编程语言中,`Collections` 类是 `java.util` 包中的一个工具类,它提供了许多静态方法,用于操作各种集合,特别是列表(List)。本文将深入探讨如何使用 `Collections` 类对 List 进行排序操作。 首先,让...
当我们谈论“list嵌套list”时,这意味着在一个列表内部包含了一个或多个列表,这样的结构可以创建出多维的数据集合。这种数据结构在处理表格数据、矩阵或树形结构时特别有用。 下面我们将详细探讨如何创建、操作和...
6. **文件08_01_webservice**:这个名字可能表示这是一个关于第八章第一节的WebService示例。这个文件可能是一个包含源代码、配置文件和其他相关资源的项目文件夹。要学习这个案例,你需要解压文件并查看其中的代码...
这个“ListCtrl控件排序类及演示程序”是针对开发者的一个资源,它提供了一种方法来实现ListView控件中数据的动态排序功能,特别适用于那些需要频繁更新和排序列表的应用。 ListCtrl控件排序类是程序中一个关键的...