繁体   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