簡體   English   中英

如何從ArrayList迭代器迭代Class Object

[英]How to iterate Class Object from an ArrayList iterator

public class EmpArray {

    private int id;
    private String name,address;

    EmpArray(int id, String name, String addr)
    {
        this.id = id;
        this.name = name;
        address = addr;
    }
    int getId()
    {
        return id;
    }
    void display()
    {
        System.out.println("Employee details are ---");
        System.out.println("Id - "+id);
        System.out.println("Name - "+name);
        System.out.println("Address - "+address);
    }
}

在main()中,我創建了一個ArrayList來存儲EmpArray類對象我的意圖是,不存儲重復的Id ..

import java.util.*;
import java.io.*;
public class EmpArrayList {

    /**
     * @param args
     * @throws IOException 
     * @throws NumberFormatException 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String name,address;
        int id;

        //Create ArrayList
        ArrayList<EmpArray> arl = new ArrayList<EmpArray>();

        //Attach iterator to ArraList to check if Id is already added!!
        Iterator it = arl.iterator();

        enter:
        {
            for(int i =0 ; i < 3; i++)
            {

                System.out.println("Enter Id:");
                id = Integer.parseInt(br.readLine());

                while(it.hasNext())
                {

                    EmpArray temp = (EmpArray) (it.next());

                    if(id == temp.getId())
                    {
                        System.out.println("Id already exists! Add another Id : ");
                        break enter;
                    }   
                }

                System.out.println("Enter Name:");
                name = br.readLine();

                System.out.println("Enter Address:");
                address = br.readLine();

                //Create an object of EmpArray Class
                EmpArray e = new EmpArray(id,name,address);
                //Add this EmpArray object to the ArrayList
                arl.add(e);
            }
        }
        //Now display all the elements stored in the ArrayList
        /*for(int i=0 ; i< 3; i++)
        {
            EmpArray ea = arl.get(i);
            ea.display();
        }*/

        //Get Id from the user and display only that employee's details
        System.out.println("Enter Id whose details are required? : ");
        int searchId = Integer.parseInt(br.readLine());
        boolean isIdAvailable = false;

        for(int i = 0; i < 3 ; i++)

        {
            EmpArray ea = arl.get(i);
            if(searchId == ea.getId())
            {
                ea.display();
                isIdAvailable = true;
                break;
            }
        }
        if(!isIdAvailable)
            System.out.println("Employee details are not available");
    }
}

當我第二次嘗試輸入Id時出現異常。 異常是在it.next()異常是並發修改異常有人可以幫助我為什么有這個異常?

你正在遍歷數組列表ArrayList<EmpArray> arl ,之后你正在改變它的狀態arl.add(e); 通過向其中添加值來修改它,這就是ConcurrentModificationException的原因。 如果可能,使用另一個數組列表將修改后的內容添加到其中

但是,您有重復內容的問題,為什么不使用SetComparatorComparable

考慮在自定義對象中實現hashCode和.equals(),而不是創建自己的重復安全機制。 這樣,您可以在ArrayList上輕松使用.contains以避免重復。

這是關於此類實現的一個很好的文檔: http//www.programcreek.com/2011/07/java-equals-and-hashcode-contract/

假設現在您知道為什么要獲得該異常,一個簡單的方法就是不使用迭代器,而是使用簡單的for循環。

// Attach iterator to ArraList to check if Id is already added!!
    // Iterator it = arl.iterator();

    enter: {
        for (int i = 0; i < 3; i++) {

            System.out.println("Enter Id:");
            id = Integer.parseInt(br.readLine());

            for (i = 0; i < arl.size(); i++) {

                EmpArray temp = (EmpArray) (arl.get(i));

                if (id == temp.getId()) {
                    System.out
                            .println("Id already exists! Add another Id : ");
                    break enter;
                }
            }

            System.out.println("Enter Name:");
            name = br.readLine();

            System.out.println("Enter Address:");
            address = br.readLine();

            // Create an object of EmpArray Class
            EmpArray e = new EmpArray(id, name, address);
            // Add this EmpArray object to the ArrayList
            arl.add(e);
        }
    }

謝謝大家的投入! 我現在明白為什么我有這樣的例外。

我也明白Set是為了避免重復,但我的目的是使用ArrayList並處理它中的重復項! 我現在不是使用迭代器而是一個簡單的循環!

再次感謝你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM