`
heshifk
  • 浏览: 10929 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

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

    一、cell数组的创建方法及...这样不会出现太多的坑爹的陷阱和错误 利用一个cell数组存储几个维数不同的向量,这个问题经常遇到。 例如第一个要存储9个数值,第二个要存储4个数值,在适当的时候还要读取里面的元素数值。

    【03-流程控制与数组】

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

    Java中常见的陷阱题及答案

    在电脑里找到一份当时学习JAVA时的笔记,看到一些现在已经遗忘的细节。稍微整理了几个,发出来与大家分享。这篇文章主要介绍了Java中常见的陷阱题及答案,需要的朋友可以参考借鉴,下面来一起看看吧。

    LeetCode刷题笔记——#88. 合并两个有序数组

      这道题有一个编程的陷阱在这里。   一般而言归并排序,需要一个额外大小为 m+n 的空间。   这里归并排序只用到了一个额外大小为 min(m, n) 的空间,较为巧妙。   如此一来,设置三个指针,只需要把当前...

    ASP.NET编程之道.part1.rar

    陷阱10 访问下拉列表控件的SelectedValue属性产生的陷阱 陷阱11 动态加载用户控件的陷阱 陷阱12 JavaScript设置服务器控件值 陷阱13 放置隐藏字段的陷阱 陷阱14 动态加载设置输出缓存的用户控件 陷阱15 为删除按钮...

    实体特质:实体陷阱,陷阱,局限性和特质

    陷阱,陷阱,局限性和特质。 这是导致我在扎实地碰到墙壁时,尤其是作为初学者入门时,使我的头撞到砖墙上的事情的清单。 注意! 这些示例来自Solidityv0.4.x。 这些示例中的某些示例可能在新版本的Solidity中不再...

    array-abstraction:实现 ArrayAccessIteratorCountable 接口的本机数组和对象的抽象

    陷阱 功能的实现是为了尽可能多地支持。 例如,这意味着您可以在仅实现 Traversable 接口而不是 ArrayAccess 的对象上使用 offsetExists。 它有效,但效率不高,而且可能不是您想要的。 代理对象 如果需要,代理对象...

    突破程序员基本功的16课.part2

    5.6.3 创建泛型数组的陷阱 5.7 正则表达式的陷阱 5.8 多线程的陷阱 5.8.1 不要调用run方法 5.8.2 静态的同步方法 5.8.3 静态初始化块启动新线程执行初始化 5.8.4 注意多线程执行环境 5.9 小结 第6课 流程...

    伴随数组、计数排序的运用

    一个星期没有写了,今天还是留点时间写一写自己的博客,周六去...还有很多就是局部分配空间,返回无效指针的题目,总之感觉考得还是蛮基础,但是又设置了不少的陷阱,我很多回来又想了想,还是觉得自己知识面太少了。

    C++大学教程,一本适合初学者的入门教材(part1)

    6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类 小结 术语 自测练习 自测练习答案 练习 第7章 类与数据抽象(二) 7...

    C语言进阶-牟海军.pdf

     一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见错误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间的...

    C语言进阶 作者 Wrestle.Wu

     一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见错误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间...

    C++入门经典(第9版).[美]Walter Savitch.分卷1

    本书是深受师生欢迎的优秀C++入门教材。...在讲解C++基础知识之后,直接引导学生深入函数、I/O流、类、控制流程、命名空间、数组、字符串、指针和动态数组、递归、模板、指针和链表、派生类、异常以及标准模板库。

    C++入门经典(第9版).[美]Walter Savitch.分卷2

    本书是深受师生欢迎的优秀C++入门教材。...在讲解C++基础知识之后,直接引导学生深入函数、I/O流、类、控制流程、命名空间、数组、字符串、指针和动态数组、递归、模板、指针和链表、派生类、异常以及标准模板库。

    Go语言核心编程_李文塔.zip

    Go虽然设计得小而美,但语言并不是wan美的,有些陷阱和坑需要*发者te别小心,本书会专门介绍Go使用过程中的陷阱,包括: defer陷阱,接口nil,变量短声明引发的困惑,range的临时变量复用,slice底层数组重分配等。...

    免费下载:C语言难点分析整理.doc

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    JavaScript中常见的八个陷阱总结

    这里我们针对JavaScript初学者给出一些技巧和列出一些陷阱。如果你已经是一个砖家,也可以读一读。 1. 你是否尝试过对数组元素进行排序? JavaScript默认使用字典序(alphanumeric)来排序。因此, [1,2,5,10].sort()...

Global site tag (gtag.js) - Google Analytics