`
黑小子
  • 浏览: 45281 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法之---数组动态扩容

阅读更多

最近几天做项目,遇到些比较棘手的问题,本来是上游系统接口数据可以送正确的,但是耍无赖不给送,导致我们自己的处理。因为是外网系统接口处理数据,接收到的是xml文件,而我们程序采用xmlbean对xml进行解析,于是会出现数组的情况。

产生问题的原因为,对于存在关系的xml中,当前xml会有个组信息的节点,通常关系为两两的关系,而如何识别他们是有关系的呢,考的是一个唯一id,也就是xml1中的组信息中有个这个id,xml2的组信息中也存在这个id,这样就可以建立关系了,如果有第三个关系,那么就是另外一个id了。而现在由于上游系统的恶心人畜,如3个xml有关系,那么这三个xml的组id是一样的,其中的一个xml中维护两套关系,如a、b、c,b要维护和a的关系,也要维护和c的关系,那么在c中就有两组信息,这就导致原两两关系的逻辑被打破,导致数据处理上的异常。

于是在对原逻辑的处理中,通过简单的if,for无法正确处理数据。并且过程中用的是数组,其实主要的问题在于b这个信息中的两套关系。因为要把具有两套关系的数据进行特殊处理,而其中还存在其它类型的组信息,所以在数组中可能存在不是同类型的组信息,为了保证大于2组的信息处理的正确性,于是通过数组copy的方式将需要的信息copy到信息的数组,由于数组大小不定,而且不能有空的元素,于是采用了动态扩容的方式。下面摘取代码片段并附说明

 

 

//原数组soGroupInfoArr,元素类型为SOGROUPINFO,长度≥1 
SOGROUPINFO[] newGroupInfo = new SOGROUPINFO[1];//声明长度为1的数组,用于数组copy
int j = 0;
for (int i = 0; i < soGroupInfoArr.length; i++) {
     groupSpecId = soGroupInfoArr[i].getGROUPTYPEID();
     if ((groupSpecIdForShareLine).indexOf(groupSpecId) != -1) {//这里是对数据的特殊判断,可以忽略
         if (j == newGroupInfo.length) {//往数组中加数据先判断数组是否满了,满了就扩容
  	         SOGROUPINFO[] arrays2 = new SOGROUPINFO[newGroupInfo.length + 1];//扩容,这里每次扩1,保证元素不存在空的
  	         System.arraycopy(newGroupInfo, 0, arrays2, 0, newGroupInfo.length);//数组copy
  	         newGroupInfo = arrays2;//将拷贝的数据赋值给扩容后的数组
  	     }
  						
  	     newGroupInfo[j++] = soGroupInfoArr[i];//将数据放到数组中
     }
}
 
soGroupInfoArr = newGroupInfo;//将处理完的数组赋值给原数组便于原逻辑复用    
 

 

 

突然发现有些算法还有有用的。哈哈,记下来

0
9
分享到:
评论
11 楼 黑小子 2012-10-12  
leonayx123 写道
arraylist 本质还是数组,他自己的扩容也是把原数组 按一定比例(乘三除2什么的)创建一个新数组后。把原数组复制过来。

你非要自己写可以参考一下这个扩容比例。有时多几个空位其实没有关系。所以每次扩1不好。


主要是不能有空位,而且以现有逻辑不想做太大改动,所以初始1,扩1
10 楼 黑小子 2012-10-12  
godlewis 写道
每次扩1,来一次新数组的创建和数组复制,造成内存对象频繁创建与遍历,性能不好。建议采用ArrayList,先将可扩展的内容加完后,最后统一toArray一下,ArrayList的扩容算法比你的好。


这个说的不错。确实可以使用arraylist.toArray,但是对于现有的项目不想做太大的改动,而且这个数组容量最大值也就是2.所以才初始为1,
9 楼 crazoy 2012-08-28  
恰好刚看过ArrayList的源码,建议lz也看一下。参考一下
8 楼 sj0129 2012-08-24  
我倒。。。。。。。。。。。。 不解释。
7 楼 vieri122 2012-08-24  
楼主多看看书吧。
6 楼 Allen_Wang 2012-08-24  
godlewis 写道
每次扩1,来一次新数组的创建和数组复制,造成内存对象频繁创建与遍历,性能不好。建议采用ArrayList,先将可扩展的内容加完后,最后统一toArray一下,ArrayList的扩容算法比你的好。

是的,这种算法只能玩玩而已。
5 楼 mynewstudy 2012-08-24  
这完全就是数组扩容的底层实现啊
4 楼 leonayx123 2012-08-24  
arraylist 本质还是数组,他自己的扩容也是把原数组 按一定比例(乘三除2什么的)创建一个新数组后。把原数组复制过来。

你非要自己写可以参考一下这个扩容比例。有时多几个空位其实没有关系。所以每次扩1不好。
3 楼 zhowg 2012-08-24  
扩容完全可以用ArrayList,再接收和返回的时候再转换为数组,没必要这么麻烦。
2 楼 liguocai2009 2012-08-24  
这也叫算法,我瞎掉了
1 楼 godlewis 2012-08-24  
每次扩1,来一次新数组的创建和数组复制,造成内存对象频繁创建与遍历,性能不好。建议采用ArrayList,先将可扩展的内容加完后,最后统一toArray一下,ArrayList的扩容算法比你的好。

相关推荐

    Array-Problems:基于数组的问题集

    - 扩容机制:数组自动扩容,但预分配的内存可能导致额外开销。 8. 高级话题 - 矩阵操作:处理二维数组,如矩阵转置、加法、乘法等。 - 动态规划:在数组问题中利用状态转移实现最优解。 - 回溯法与深度优先搜索...

    算法-数据结构和算法-3-顺序表.rar

    顺序表作为最基础的数据结构之一,对于理解复杂算法至关重要。在这个压缩包“算法-数据结构和算法-3-顺序表.rar”中,我们重点探讨的是顺序表的概念、实现及其在实际问题中的应用。 顺序表是一种线性数据结构,它将...

    数据结构和算法必知必会的50个代码实现

    - 实现一个支持动态扩容的数组 - 实现一个大小固定的有序数组,支持动态增删改操作 - 实现两个有序数组合并为一个有序数组 链表 - 实现单链表、循环链表、双向链表,支持增删操作 - 实现单链表反转 - 实现两个有序...

    数据结构与算法--java版本

    - 顺序存储可能需要预留额外的空间以避免频繁扩容,而链式存储则更加灵活。 **3.5 链接表** - **基于结点的操作:** - 包括插入新结点、删除结点等。 - **链接表接口:** - 定义了链接表的一系列操作方法。 *...

    数组实现线性表-VS2015.zip_数组实现线性表格

    4. **数组扩容**:如果数组已满,而我们需要插入更多元素,可以考虑动态扩展数组。这通常涉及到创建一个更大的新数组,复制旧数组中的元素,然后释放旧数组。但这种方式会增加复杂性,因为数组在C++中是静态分配的,...

    HashMap扩容时的rehash方法中(e.hash & oldCap) == 0算法推导.docx

    总结起来,HashMap的扩容`rehash`过程中`(e.hash & oldCap) == 0`的算法推导是基于`oldCap`为2的幂次方的特性,通过对`e.hash`进行按位运算,将元素在新旧数组中的位置进行了巧妙的划分,保证了扩容过程的高效性和...

    Java数据结构和算法之Java数组

    当数组容量不足时,可以创建新的大数组并将旧数组元素复制过去,这种方法称为动态扩容。例如,在Java的ArrayList类中就实现了这个功能。 然而,数组也有其局限性,比如长度不可变和无法动态调整大小。在这种情况下...

    Java数组-学习笔记.docx

    数组扩容** - 当数组容量不足时,可以通过复制原数组到一个更大容量的新数组来实现扩容。 - 扩容后需要更新对原数组的引用指向新数组。 例如: ```java int[] newArr = Arrays.copyOf(arr, arr.length * 2); // ...

    02-B-2 动态空间管理 & 02-B-3 递增式扩容1

    在动态空间管理中,递增式扩容是一种常见的策略。当数组的当前容量不足以容纳新插入的元素时,程序会自动扩大数组的大小。这种扩容通常不是简单地增加一个元素的空间,而是选择一个更大的容量值,以减少频繁扩容带来...

    数据结构与算法分析--线性表实现

    3. 动态扩容:对于顺序表,需实现动态扩容策略,避免频繁的内存分配和拷贝。 4. 线程安全:在多线程环境中,可能需要实现同步控制以确保数据的一致性。 总结起来,线性表的实现涉及数据结构的选择、插入和删除操作...

    用数组实现的优先队列(JAVA)

    - 当数组容量不足时,如何动态扩容? - 如何实现一个最大堆,其中队首元素具有最高优先级? - 如何实现一个可调整优先级的优先队列? 总之,`PriorityQ.java`文件可能是一个简单的数组实现优先队列的示例,通过...

    Java算法实例-链栈和顺序栈操作

    但它的缺点是大小固定,如果栈的元素数量超过预先设定的容量,需要进行扩容操作,这会带来额外的时间开销。 2. **链栈**:链栈是通过链表实现的栈,每个节点包含一个数据元素和一个指向下一个节点的引用。与顺序栈...

    算法动态图.pdf

    - 动态图说明了扩容的过程,通常是将原数组大小扩大1.5倍,并将原有元素复制到新数组中。 3. **remove(E)** - 删除指定元素。 - 动态图演示了如何找到并删除指定元素,然后将后面的元素向前移动以填补空缺。 ##...

    Java数组讲解

    #### 1.2 数组扩容 - **扩容必要性**:定义数组后,其长度固定不变。如果需要增加更多元素,则需要进行扩容。 ```java int[] oldArray = {1, 2, 3}; int[] newArray = new int[oldArray.length * 2]; // 扩容为...

    动态数组DanymicArray

    动态数组(Dynamic Array)是一种在计算机编程中常用的数据结构,它允许在...通过对比分析这两种不同的实现方式,我们可以学习到动态数组扩容策略的设计和优化,这对于理解数据结构和算法,提高编程技能非常有帮助。

    c语言实现动态数组代码

    2. 扩容:当数组满时,我们需要重新分配更大的内存,并将已有元素复制到新内存区域。这里可以使用realloc()函数,它会在原有内存基础上增加空间,如果原地址不够,则会在堆上寻找新的连续空间。 ```c if (current_...

    数据结构与算法基础--第05周03--3.1栈和队列的定义和特点1--3.1.2队列的定义和特点.pdf

    在实际应用中,循环顺序队列更为常见,因为它能更有效地利用空间,避免了数组扩容的问题。 4. **运算规则**: 在队列中,我们只能在队尾执行插入(入队)操作,而在队头执行删除(出队)操作。队列的这一特性确保...

    第02章 线性表.zip

    总的来说,这些算法涵盖了线性表的核心操作,包括插入、删除、查找、排序、反转、合并、动态扩容、复制以及切片等。通过学习和实践这些算法,我们可以深入理解线性表的工作原理,并能够熟练地在实际编程中运用这一...

    算法-理论基础- 线性表- 顺序表(包含源程序).rar

    3. 插入函数:如何在特定位置插入元素,处理可能的数组扩容。 4. 删除函数:如何删除指定位置的元素,处理可能的元素移动。 5. 查找函数:如何快速找到指定元素,以及返回其在表中的位置。 6. 遍历函数:顺序地...

    数据结构与算法-实验报告-实验1.doc

    需要注意的是,如果顺序表已满,则需要先进行扩容处理。 - **删除操作**:从顺序表中移除指定位置的元素。同时还需要考虑移动后续元素以保持连续性。 - **查找操作**:搜索顺序表中是否存在特定元素。可以采用顺序...

Global site tag (gtag.js) - Google Analytics