`
heshifk
  • 浏览: 12985 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数组陷阱

 
阅读更多

        由于需求变更,以前静态显示的值现在需要动态显示,用户能在配置文件或是在某些页面上面手工指定哪些东西需要显示,哪些需要隐藏。还有一个前提是,改后后设定了10个组件能显示,不过这也是考虑到页面到时候放不下而设置的,程序里面并没有做控制,既然是手工指定,那就应该能显示任意多个。背景介绍完毕。

        刚开始被通知这方面需要改的时候,内心是崩溃的、反对的,因为前期代码写的不够灵活,改动量确实比较大,但是工程说这是客户要求的,没办法。于是动手开始改,一步步来,先从页面上感觉最难改的地方开始改,有点扯远了,还是说一下遇到的这个数组陷阱。由于需要动态显示,那么查询出来的记录需要判断,删掉不符合要求的,然后问题就是出在删除上面,

int flag = 0;		//判断有多少个列未显示
for (int i=0;i<pList.size();i++) {
	T p =pList.get(i);
	if(p.getColumn().equals("he")){
		flag++;
		continue;
	}
	p.setColumn(p.getColumn()-flag);				
}   //  命名上面已经做了处理

 这是修改之后没有问题的代码,但是之前也有些问题,之前改好的第一版代码是:

 

 

//			for (T property : pList) {
//				if(p.getColumn().equals("he")){
//					continue;
//				}

这两段代码只是相差一个p.setColumn(p.getColumn()-flag);之前没有做这个处理,因为涉及到表格索引问题,然后直接就抛出超出索引异常。

 

    这只是我说的一处,修改另外一个地方也有点问题,那里直接将传一个List过去,然后我就直接在循环里面使用pList.remove(p);完整的代码是酱紫的:

for (T property : pList) {
    if(p.getColumn().equals("he")){
        flag++;
        pList.remove(p);
        continue;
    }

 ,当进到那个if判断语句之后,再回到for语句,直接抛出java.util.ConcurrentModificationException,第一次遇到这种异常,平时一般只是碰到空指针异常或是类转换异常,百度之后发现是类集迭代出现问题。其实抛出这种异常也比较在理,如果不是在list集的最后一个执行remove方法,意味着被移除的类集后面的执行地址将地址,里面结果我不是很懂,但是list也是对数组的封装,而数组初始化的时候,根据存储的值得类型,初始化不同的空间,当中间某个值被删除了,如果一个个遍历过去,被删除的后面的数据也就访问不到了,这也是比较正常的情况。还有一个问题是运行过程中,感觉会有问题,实际情况真有问题。当上面那段代码被改写成如下的代码之后:

for (int i=0;i<prList.size();i++) 

 如果依然在里面执行remove方法,for语句应该会少执行一次,除非remove的是类集的最后一个数据。因为List类集根据里面的内容,动态的改变自身的size:

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

    /*
     * Private remove method that skips bounds checking and does not
     * return the value removed.
     */
    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

 这段代码是java源码ArrayList里面的,每次执行remove方法的时候,它的size也就动态的建议(--size)。最后for循环没有变,重新建了一个List,将每次符合要求的对象存进去,最后return这个对象就好了,不这样的话,无法满足要求,因为这里也涉及到表格索引的问题。

0
1
分享到:
评论

相关推荐

    JAVA编程指南.pdf

    6. **字符数组陷阱**:处理字符数组时,要注意字符与字节的区别,以及编码问题。 7. **转义字符陷阱**:不当使用转义字符可能导致字符串解析错误。 8. **打印输出类名陷阱**:System.out.println()打印对象时默认...

    数组与指针的艺术.doc

    此外,还会讨论一些常见的陷阱和误区,如指针运算、指针解引用、数组越界等问题,以避免编程时出现错误。 在学习过程中,读者可能会遇到各种困惑,作者鼓励读者通过讨论和实践来深化理解。文中推荐了《C与指针》这...

    数组和指针学习资料

    C语言指针经验总结可能包含实践中的技巧和陷阱,帮助开发者在实际项目中更好地应用指针。 通过这些学习资料,你将能够: 1. 理解数组的创建、访问和遍历。 2. 掌握指针的基本操作,包括声明、初始化、赋值和解引用...

    C++之数组与指针的异同 pdf

    在C++编程语言中,数组和指针是两种非常重要的数据结构,它们在内存管理和数据访问方面发挥着关键作用。...通过深入研究它们的工作原理,程序员可以更好地利用C++的强大功能,避免常见的陷阱和错误。

    js代码-数组引用陷阱 reverse reverse() 方法将数组中元素的位置颠倒,并返回该数组的引用

    这就是所谓的“数组引用陷阱”,如果你不希望原始数组被修改,就需要先复制一份数组再进行操作。 要避免这种情况,可以使用`slice()`方法或者`Array.from()`方法来创建数组的副本: ```javascript let arr = [1, 2...

    C/C++数组名与指针区别深层探索

    ### C/C++数组名与指针的区别深层探索 在C/C++编程语言中,指针是一种非常重要的数据类型,它提供了直接访问...正确地区分数组名和指针的概念可以帮助开发者更好地利用这两种数据结构的优势,避免常见的陷阱和错误。

    C++指针 数组 内存释放.docx

    C++指针数组内存释放 C++指针是一种基本变量,包含一个实际的数据,该数据代表一个可以找到实际信息的内存地址。指针是C++编程中非常重要的概念,许多程序和思想依靠指针作为他们设计的基础。 定义指针变量 定义...

    论C语言数组.pdf

    5. **错误分析**:展示并解释数组相关的常见错误,如未初始化数组、数组越界等,帮助学生避免这些陷阱。 通过以上方式,教师可以帮助学生克服对数组的畏惧,提高他们对C语言的理解和编程技能。

    C语言关于数组实例饿饿不

    7. **数组操作的陷阱** - 不要忘记数组索引是从0开始的,`numbers[n]`是第`n+1`个元素。 - 当数组作为参数传递给函数时,传递的是数组首元素的地址,而不是数组本身,所以在函数内部不能改变数组的大小。 - 动态...

    java 二维数组

    ### Java 二维数组详解 #### 一、二维数组的概念与定义 在Java中,所谓的“二维数组”实际上是指“元素是一维数组的一维...同时,注意避免常见的陷阱,如数组越界等问题,可以帮助我们编写出更加健壮和高效的程序。

    数组与指针的用法及易错解

    三、易错点与陷阱 1. 数组大小:数组大小在声明时必须指定,且在整个生命周期内不可更改。尝试改变数组大小会导致未定义行为。 2. 指针越界:访问指针超出其所指向的数组范围会产生未定义行为,可能导致程序崩溃。...

    数组函数参考例题.rar

    在学习数组函数的过程中,常见的一些问题可能包括如何选择合适的函数来处理特定的数据操作,如何避免常见的性能陷阱,以及如何理解和解决函数的边界条件问题。例如,`splice()`函数在JavaScript中既可以添加元素,也...

    【03-流程控制与数组】

    •数组最常用的用法就是访问数组元素,包括对数组元素赋值和访问数组元素的值,访问数组元素是通过在数组引用变 量后紧跟一个方括号([ ]),方括号里是数组元素的索引值。 •Java语言的数组索引是从0开始的,...

    C++ 数组讲义大全(目录在描述里)

    此外,还需要注意避免常见的陷阱,比如数组越界等问题。随着你对C++编程技能的不断提高,数组将成为你解决问题时的重要工具。继续深入学习和实践,你将能够更加熟练地利用数组来处理各种复杂的数据结构和算法问题。

    C语言缺陷和陷阱.pdf

    根据提供的文件内容,我们可以提炼出一些关于C语言的编程知识点,包括语言缺陷、陷阱、常见的错误、以及一些编程技巧。 1. C语言的基础缺陷: - C语言是静态类型语言,不支持隐式类型转换,这在某些情况下可能会...

    C语言中数组与指针的探讨.pdf

    在C语言中,数组和指针是两个非常重要的概念,它们之间存在着紧密的联系。数组可以被视为一组相同类型的元素集合,而...在实际编程中,应充分利用它们的特性,同时避免潜在的陷阱,如数组越界、指针未初始化等问题。

    cell数组MATLAB 创建方法以及注意事项

    - Cell数组不适合存储过于复杂的数据,因为不同单元格内的数据类型可以不同,这可能导致错误和陷阱。 - Cell数组常用于存储长度不一的向量,如存储长度分别为9和4的两个向量。 - 在进行读取时,必须注意`{}`和`()`的...

    100个windows平台C++开发错误之十八数组

    本篇文章将深入探讨“100个Windows平台C++开发错误之十八:数组”这一主题,主要关注数组相关的常见问题、陷阱以及解决策略。 数组在C++中是一种非常基础且重要的数据结构,它允许我们存储同类型的多个元素。然而,...

Global site tag (gtag.js) - Google Analytics