<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
話題看起來有點老生了,但是加入JSONArray還是有很多新意
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3456); list.add(3456); list.add(4); for(int i =0; i < list.size(); i++) { if(list.get(i) == 3456) { list.remove(i); } } System.out.println(list);
沒有異常,有輸出結果[1, 2, 3456, 4],顯然是不對的,沒有把第二個3456刪除掉,問題比較明顯,就是每當刪除一個條目底層就會有一次資料移動,即被刪除條目下一個索引資料佔據了被刪除條目的位置,進入到下一輪遍歷時恰好跳過了原來的下一個條目,就出現了上述的錯誤現象。所以此種遍歷方式是不正確的。
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3456); list.add(3456); list.add(4); /*for(int i =0; i < list.size(); i++) { if(list.get(i) == 3456) { list.remove(i); } }*/ for(Integer i: list) { if(i == 3456) { list.remove(i); } } System.out.println(list);
直接報出異常了:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
所以此種方式必然不行了。
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3456); list.add(3456); list.add(4); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { if(iterator.next() == 3456) { iterator.remove(); } } System.out.println(list);
執行結果,完全正確[1, 2, 4]。這也是最推薦的方式。
當然,除了第3種方式外,還有2種可以考慮的方式:
方式4. 不刪除,而是new一個新的list的將其中符合條件的新增到新的list,其實就實現了刪除,還是比較穩妥的方式。
方式5.再一種就是對方式1的改進,一旦滿足條件執行了刪除,就將index--,這樣也是可以實現的,只是很彆扭。
首先,通過JSONArray的原始碼看下,其中與ArrayList的關聯,進入JSONArray類檢視remove的程式碼:
private final List<Object> list; public JSONArray() { this.list = new ArrayList(); } public boolean remove(Object o) { return this.list.remove(o); }
可以看到,底層就是呼叫的ArrayList的remove方法,那麼據此可以推斷方式1,2也會各自存在同樣的問題。
那麼方式3是不是就完全ok了?
JSONObject o1 = new JSONObject(); o1.put("key", 324); JSONObject o2 = new JSONObject(); o2.put("key", 325); JSONObject o3 = new JSONObject(); o3.put("key", 325); JSONObject o4 = new JSONObject(); o4.put("key", 327); JSONArray ja = new JSONArray(); ja.add(o1); ja.add(o2); ja.add(o3); ja.add(o4); Iterator<Object> o = ja.iterator(); while (o.hasNext()) { JSONObject jo = (JSONObject) o.next(); if(jo.getIntValue("key") == 325) { //ja.remove(jo); //不要用這種方式刪除,會報出ConcurrentModificationException o.remove(); //這種方式OK的 } } System.out.println(ja);
執行結果[{"key":324},{"key":327}]是完全正確的,只是這裡有一點需要注意的是儘管迴圈用了iterator,那麼刪除的時候也要用迭代器即o.remove()而不是ja.remove(jo),否則還是會有異常的。
此外,對應的方式4,5在這裡也是適用的,尤其是方式4,也是不錯的方案。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45