最近几天做项目,遇到些比较棘手的问题,本来是上游系统接口数据可以送正确的,但是耍无赖不给送,导致我们自己的处理。因为是外网系统接口处理数据,接收到的是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;//将处理完的数组赋值给原数组便于原逻辑复用
突然发现有些算法还有有用的。哈哈,记下来
分享到:
相关推荐
- 扩容机制:数组自动扩容,但预分配的内存可能导致额外开销。 8. 高级话题 - 矩阵操作:处理二维数组,如矩阵转置、加法、乘法等。 - 动态规划:在数组问题中利用状态转移实现最优解。 - 回溯法与深度优先搜索...
顺序表作为最基础的数据结构之一,对于理解复杂算法至关重要。在这个压缩包“算法-数据结构和算法-3-顺序表.rar”中,我们重点探讨的是顺序表的概念、实现及其在实际问题中的应用。 顺序表是一种线性数据结构,它将...
- 实现一个支持动态扩容的数组 - 实现一个大小固定的有序数组,支持动态增删改操作 - 实现两个有序数组合并为一个有序数组 链表 - 实现单链表、循环链表、双向链表,支持增删操作 - 实现单链表反转 - 实现两个有序...
4. **数组扩容**:如果数组已满,而我们需要插入更多元素,可以考虑动态扩展数组。这通常涉及到创建一个更大的新数组,复制旧数组中的元素,然后释放旧数组。但这种方式会增加复杂性,因为数组在C++中是静态分配的,...
总结起来,HashMap的扩容`rehash`过程中`(e.hash & oldCap) == 0`的算法推导是基于`oldCap`为2的幂次方的特性,通过对`e.hash`进行按位运算,将元素在新旧数组中的位置进行了巧妙的划分,保证了扩容过程的高效性和...
当数组容量不足时,可以创建新的大数组并将旧数组元素复制过去,这种方法称为动态扩容。例如,在Java的ArrayList类中就实现了这个功能。 然而,数组也有其局限性,比如长度不可变和无法动态调整大小。在这种情况下...
数组扩容** - 当数组容量不足时,可以通过复制原数组到一个更大容量的新数组来实现扩容。 - 扩容后需要更新对原数组的引用指向新数组。 例如: ```java int[] newArr = Arrays.copyOf(arr, arr.length * 2); // ...
在动态空间管理中,递增式扩容是一种常见的策略。当数组的当前容量不足以容纳新插入的元素时,程序会自动扩大数组的大小。这种扩容通常不是简单地增加一个元素的空间,而是选择一个更大的容量值,以减少频繁扩容带来...
3. 动态扩容:对于顺序表,需实现动态扩容策略,避免频繁的内存分配和拷贝。 4. 线程安全:在多线程环境中,可能需要实现同步控制以确保数据的一致性。 总结起来,线性表的实现涉及数据结构的选择、插入和删除操作...
- 当数组容量不足时,如何动态扩容? - 如何实现一个最大堆,其中队首元素具有最高优先级? - 如何实现一个可调整优先级的优先队列? 总之,`PriorityQ.java`文件可能是一个简单的数组实现优先队列的示例,通过...
但它的缺点是大小固定,如果栈的元素数量超过预先设定的容量,需要进行扩容操作,这会带来额外的时间开销。 2. **链栈**:链栈是通过链表实现的栈,每个节点包含一个数据元素和一个指向下一个节点的引用。与顺序栈...
- 动态图说明了扩容的过程,通常是将原数组大小扩大1.5倍,并将原有元素复制到新数组中。 3. **remove(E)** - 删除指定元素。 - 动态图演示了如何找到并删除指定元素,然后将后面的元素向前移动以填补空缺。 ##...
#### 1.2 数组扩容 - **扩容必要性**:定义数组后,其长度固定不变。如果需要增加更多元素,则需要进行扩容。 ```java int[] oldArray = {1, 2, 3}; int[] newArray = new int[oldArray.length * 2]; // 扩容为...
动态数组(Dynamic Array)是一种在计算机编程中常用的数据结构,它允许在...通过对比分析这两种不同的实现方式,我们可以学习到动态数组扩容策略的设计和优化,这对于理解数据结构和算法,提高编程技能非常有帮助。
2. 扩容:当数组满时,我们需要重新分配更大的内存,并将已有元素复制到新内存区域。这里可以使用realloc()函数,它会在原有内存基础上增加空间,如果原地址不够,则会在堆上寻找新的连续空间。 ```c if (current_...
在实际应用中,循环顺序队列更为常见,因为它能更有效地利用空间,避免了数组扩容的问题。 4. **运算规则**: 在队列中,我们只能在队尾执行插入(入队)操作,而在队头执行删除(出队)操作。队列的这一特性确保...
总的来说,这些算法涵盖了线性表的核心操作,包括插入、删除、查找、排序、反转、合并、动态扩容、复制以及切片等。通过学习和实践这些算法,我们可以深入理解线性表的工作原理,并能够熟练地在实际编程中运用这一...
3. 插入函数:如何在特定位置插入元素,处理可能的数组扩容。 4. 删除函数:如何删除指定位置的元素,处理可能的元素移动。 5. 查找函数:如何快速找到指定元素,以及返回其在表中的位置。 6. 遍历函数:顺序地...
需要注意的是,如果顺序表已满,则需要先进行扩容处理。 - **删除操作**:从顺序表中移除指定位置的元素。同时还需要考虑移动后续元素以保持连续性。 - **查找操作**:搜索顺序表中是否存在特定元素。可以采用顺序...