第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

我可以順序使用許多 listIterators 來(lái)改變或刪除 Java 中 ArrayList

我可以順序使用許多 listIterators 來(lái)改變或刪除 Java 中 ArrayList

慕哥9229398 2024-01-25 23:04:23
我依靠列表迭代器來(lái)移動(dòng)字符列表。這是一個(gè)單線程程序,我在 4 種不同的方法中順序使用 listIterator 對(duì)象。每種方法都有相同的設(shè)置:private void myMethod(ArrayList<Integer> input) {    ListIterator<Integer> i = input.listIterator();    while (i.hasNext()) {        Integer in = i.next();        if (in < 10)            i.remove();        else            i.set(in*in); // because its lucky    }}使用此模式,在第二個(gè)迭代器上將引發(fā)以下異常:java.util.ConcurrentModificationException但是,查看 javadocs,我在拋出的異常中沒(méi)有看到此異常,也沒(méi)有看到完成后關(guān)閉迭代器的方法。我是否錯(cuò)誤地使用了 listIterator?我必須多次迭代同一個(gè) ArrayList,每次都有條件地刪除或改變每個(gè)元素。也許有更好的方法來(lái)迭代 ArrayList,而 ListIterator 不能最好地解決這個(gè)用例。ListIterator 的 java 文檔
查看完整描述

3 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

javadoc中對(duì)此進(jìn)行了解釋ArrayList,您正在使用以下命令remove()修改列表:set()Iterator

此類的iteratorlistIterator方法返回的迭代器是快速失敗的:如果在創(chuàng)建迭代器后的任何時(shí)間對(duì)列表進(jìn)行結(jié)構(gòu)修改,除了通過(guò)迭代器自己的刪除或添加方法之外的任何方式,迭代器將拋出ConcurrentModificationException.?因此,面對(duì)并發(fā)修改,迭代器會(huì)快速而干凈地失敗,而不是在未來(lái)不確定的時(shí)間冒任意、非確定性行為的風(fēng)險(xiǎn)。



查看完整回答
反對(duì) 回復(fù) 2024-01-25
?
慕雪6442864

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

當(dāng)顯示的代碼顯然不是產(chǎn)生異常的代碼時(shí),很難對(duì)問(wèn)題進(jìn)行診斷,因?yàn)樗踔翢o(wú)法編譯。remove的方法不Iterator接受參數(shù),并且該set方法是在 上定義的,但您的代碼僅ListIterator將變量聲明為。iIterator


固定版本


private void myMethod(ArrayList<Integer> input) {

    ListIterator<Integer> i = input.listIterator();

    while (i.hasNext()) {

        Integer in = i.next();

        if (in < 10)

            i.remove();

        else

            i.set(in*in);

    }

}

會(huì)毫無(wú)問(wèn)題地運(yùn)行。您的一般問(wèn)題的答案是,每次修改都會(huì)使所有現(xiàn)有迭代器無(wú)效,除了當(dāng)您確實(shí)使用迭代器而不是直接使用集合接口進(jìn)行修改時(shí)用于進(jìn)行修改的迭代器。


但在您的代碼中,只有一個(gè)迭代器,它僅針對(duì)這一操作而創(chuàng)建和使用。只要不重復(fù)使用同一個(gè)集合的迭代器,就不會(huì)出現(xiàn)失效問(wèn)題。無(wú)論如何,先前操作中存在的迭代器都會(huì)被放棄,并且后續(xù)操作中使用的迭代器還不存在。


盡管如此,它還是更容易使用


private void myMethod(ArrayList<Integer> input) {

    input.removeIf(in -> in < 10);

    input.replaceAll(in -> in*in);

}

反而。與原始代碼不同,這會(huì)執(zhí)行兩次迭代,但正如本答案中所解釋的,removeIf在性能確實(shí)很重要的情況下,實(shí)際上會(huì)比基于迭代器的刪除更快。


但問(wèn)題仍然存在。顯示的代碼不會(huì)導(dǎo)致ConcurrentModificationException,因此您的實(shí)際問(wèn)題在其他地方,并且可能仍然存在,無(wú)論如何實(shí)現(xiàn)這一方法。


查看完整回答
反對(duì) 回復(fù) 2024-01-25
?
動(dòng)漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

我對(duì) Java ListIterators 的了解不夠,無(wú)法回答這個(gè)問(wèn)題,但看來(lái)我在這里遇到了 XY 問(wèn)題。使用 Java Streams 似乎可以更好地解決這個(gè)問(wèn)題,即通過(guò)對(duì)原始 ArrayList 中的每個(gè)元素執(zhí)行函數(shù)來(lái)刪除元素或?qū)⒃赜成涞叫碌?ArrayList 中。


    private ArrayList<Integer> myMethod(ArrayList<Integer> input) {

        ArrayList<Integer> results = input.stream().filter(

            in -> (in < 10)).collect(Collectors.toCollection(ArrayList::new));


        results = input.stream().map(

            in -> in*in).collect(Collectors.toCollection(ArrayList::new));


        return results;

    }


查看完整回答
反對(duì) 回復(fù) 2024-01-25
  • 3 回答
  • 0 關(guān)注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)