ลบรายการออกจาก ArrayList


100

ฉันArrayListคิดว่าlistมันมี 8 รายการ AH และตอนนี้ฉันต้องการลบตำแหน่ง 1,3,5 รายการที่เก็บไว้ในอาร์เรย์ int จากlistวิธีที่ฉันจะทำได้

ฉันกำลังพยายามทำสิ่งนี้ด้วย

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

แต่หลังจากรายการแรกที่ลบตำแหน่งของอาร์เรย์จะเปลี่ยนไปและในการทำซ้ำครั้งถัดไปจะลบองค์ประกอบที่ไม่ถูกต้องหรือให้ข้อยกเว้น


วิธีการลบตามลำดับจากมากไปหาน้อยของดัชนี (เรียงลำดับดัชนีจากนั้นลบองค์ประกอบที่มีดัชนีสูงสุดก่อน)
nhahtdh

1
ตรรกะของคุณมีข้อบกพร่อง แน่นอนว่าคุณไม่ควรคิดเกี่ยวกับตำแหน่งของแต่ละรายการ แต่จะคิดถึงรายการนั้น ๆ แทน ในคำอื่น ๆ ที่คุณไม่ต้องการที่จะเอาตำแหน่งที่ 1, 3 และ 5 แต่คุณต้องการที่จะลบรายการ (ที่ใดก็ตามที่พวกเขาอยู่ในList) โดยใช้equals("B"), และequals("D") equals("F")ลองคิดดูสิ
Squonk

ใช่ฉันต้องการลบรายการ แต่ฉันจะจับคู่ไอเท็มได้อย่างไร จริงๆแล้วรายการนี้อยู่ใน ListView และเมื่อเลือกฉันต้องการลบสิ่งนี้จาก DB และ Array และรีเฟรชอะแดปเตอร์และรายการ
Krishnakant Dalal

ตัวเลือกที่ช้า: วนซ้ำเมื่อเพิ่มองค์ประกอบไปยังรายการที่สองวนซ้ำรายการที่สองที่ลบออกจากรายการแรก (ขั้นตอนที่เลือกได้: คืนรายการที่สองให้กับผู้โทร)
SparK

คำตอบ:


134

ในกรณีนี้คุณควรลบองค์ประกอบตามลำดับจากมากไปหาน้อย ดัชนีแรก5แล้วแล้ว3 1สิ่งนี้จะลบองค์ประกอบออกจากรายการโดยไม่มีผลข้างเคียงที่ไม่พึงปรารถนา

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
ArrayList ของ OP ประกอบด้วยStrings ไม่ใช่Integers (อย่างไรก็ตามฉันเห็นด้วยกับการสังเกตของคุณ)
Alex Lockwood

@ Alex: คำตอบนี้ใช้ได้ แต่มีข้อบกพร่องพอ ๆ กับตรรกะของ OP ในคำถามของพวกเขา เรากำลังพูดถึงArrayList<E>- ทำไมทุกคนถึงต้องการลบวัตถุออกจากตำแหน่งที่ArrayListอิงจากตำแหน่งเท่านั้นแทนที่จะทดสอบว่ามีอะไรอยู่ที่ตำแหน่งนั้น? OP อาจใช้Stringเป็นประเภทออบเจ็กต์ได้ArrayListเป็นอย่างดี แต่คำตอบของคุณเป็นการฝึกฝนการเขียนโค้ดที่แย่มากสำหรับ generics แม้ว่าจะแก้สถานการณ์เฉพาะของ OP ได้ก็ตาม
Squonk

3
ใช่ฉันเห็นด้วยกับคุณ. แต่ OP ถามเกี่ยวกับการไม่ได้ArrayList<String> ArrayList<E>
Adrian Monk

ฉันไม่เห็นด้วยกับคำตอบนี้อย่างสิ้นเชิง @MisterSquonk คุณเชื่อว่าวิธีแก้ปัญหาต้องเป็นแบบทั่วไป ยิ่งไปกว่านั้นทำไมฉันถึงได้รับการโหวตลง?
Mohammed Azharuddin Shaikh

66
ตกลงฟัง ... ฉันไม่รู้ว่าเรื่องใหญ่คืออะไร OP โพสต์รหัสของเขาและฉันตอบกลับด้วยคำตอบที่แสดงให้เห็นถึงการแก้ไขที่เป็นไปได้ ฉันขอโทษที่ฉันไม่ได้ไปไกลกว่านั้นโดยให้วิธีแก้ปัญหาทั่วไปอย่างสมบูรณ์ ... แต่เท่าที่ฉันบอกได้ OP ไม่ได้ขอบทเรียนการเขียนโปรแกรม เขาถามว่า "ทำไมรหัสนี้ใช้ไม่ได้" อย่าเริ่มโทษฉันที่ลงคะแนนคำตอบของคุณเพียงเพราะคุณตีความคำถามแตกต่างกัน
Alex Lockwood

30

คุณสามารถลบองค์ประกอบจากArrayListการใช้ListIterator,

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

วิธีปฏิบัติที่ดีและดีกว่าในการใช้เมธอด ListIterator remove () ในการลบอ็อบเจ็กต์ออกจาก Collection ใน Java เนื่องจากอาจมีโอกาสที่เธรดอื่นกำลังแก้ไขคอลเล็กชันเดียวกันและอาจนำไปสู่ ​​ConcurrentModificationException
Min2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

ดังที่กล่าวมาแล้ว

iterator.remove()

อาจเป็นวิธีเดียวที่ปลอดภัยในการลบรายการระหว่างลูป

เพื่อความเข้าใจอย่างลึกซึ้งยิ่งขึ้นเกี่ยวกับการลบรายการโดยใช้ตัววนซ้ำให้ลองดูที่หัวข้อนี้


ฉันงงงวยไม่โหวตฉันเห็นด้วยกับคุณทั้งหมด วิธีนี้เป็นวิธีที่ปลอดภัยที่สุด
Simmant

3

ฉันถือว่าอาร์เรย์ที่ฉันเรียงลำดับขึ้นนี่เป็นอีกวิธีหนึ่งของ Iterator ซึ่งเป็นแบบทั่วไปมากกว่า:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

แล้วเรื่องนี้ล่ะ? แค่ลองคิดดู -

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

และผลลัพธ์คือ -

[A, C, E, G, H]

2

ลองวิธีนี้

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}


2

หากคุณใช้ "=" แบบจำลองจะถูกสร้างขึ้นสำหรับรายการอาร์เรย์ดั้งเดิมในรายการที่สอง แต่การอ้างอิงจะเหมือนกันดังนั้นหากคุณเปลี่ยนแปลงในรายการหนึ่งอีกรายการจะได้รับการแก้ไขด้วย ใช้สิ่งนี้แทน "="

        List_Of_Array1.addAll(List_Of_Array);

2

วิธี remove (int index) ของ arraylist จะลบองค์ประกอบที่ตำแหน่งที่ระบุ (ดัชนี) ในรายการ หลังจากลบรายการอาร์เรย์แล้วจะเลื่อนองค์ประกอบที่ตามมาไปทางซ้าย

หมายความว่าหากรายการอาร์เรย์มี {20,15,30,40}

ฉันได้เรียกวิธีการ: arraylist.remove (1)

จากนั้นข้อมูล 15 จะถูกลบและ 30 & 40 ทั้งสองรายการจะถูกเลื่อนไปทางซ้าย 1

ด้วยเหตุนี้คุณจึงต้องลบรายการดัชนีที่สูงกว่าของรายการอาร์เรย์ก่อน

ดังนั้น .. สำหรับสถานการณ์ที่คุณกำหนด .. รหัสจะเป็น ..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.