【问题标题】:Iterating hashmap of arraylist of two different Class types迭代两种不同类类型的arraylist的hashmap
【发布时间】:2017-10-22 18:11:30
【问题描述】:

我必须创建一个 arraylist 的 hashmap,但 arraylist 可以是 StudentRecord 或 TeacherRecord 类型(它们是两个不同的类)我已经添加了两个记录,但我无法使用 display method.can 遍历 hashmap 的内容有人帮我定义显示功能吗?

public class StudentRecord 
    {
        String first_Name;
        String last_Name;
        String [] courses_Registered;
        String status;
        Date date;

    StudentRecord(String f_name,String l_name,String [] courses,String status,Date dat )
    {
        this.first_Name=f_name;
        this.last_Name=l_name;
        this.courses_Registered=courses;
        this.status=status;
        this.date=dat;
    }

}

public class TeacherRecord 
{
    String first_Name;
    String last_Name;
    String address;
    String phone;
    String specilization;
    String location;

    TeacherRecord(String f_name,String l_name,String addr,String number,String spec,String loc )
    {
        this.first_Name=f_name;
        this.last_Name=l_name;
        this.address=addr;
        this.phone=number;
        this.location=loc;
    }
}

public class Montreal_server
{

    String record_id;
    ArrayList<StudentRecord> student_arraylist=new ArrayList<StudentRecord>();
    ArrayList<TeacherRecord>teacher_arraylist=new ArrayList<TeacherRecord>();

    HashMap<String,ArrayList> map=new HashMap<String,ArrayList>();

    void createTRecord(String f_name,String l_name,String addr,String number,String spec,String loc)
    {
        TeacherRecord t=new TeacherRecord(f_name,l_name,addr,number,spec,loc);
        teacher_arraylist.add(t);
        map.put("x",teacher_arraylist);


    }

    void createSRecord(String f_name,String l_name,String [] courses,String status,Date dat)
    {
        StudentRecord s=new StudentRecord(f_name,l_name,courses,status,dat);
        student_arraylist.add(s);
        map.put("s",student_arraylist);




    }

    void display()
    {
        System.out.println("inside display");
        for(Entry<String, ArrayList> en : map.entrySet())
        {
            java.util.Iterator<StudentRecord> itr = ((List<StudentRecord>)student_arraylist).iterator();



            while(itr.hasNext())
            {
                Object c=(Object)itr.next();

                System.out.println(c.first_Name+" "+c.last_Name+" "+c.status+" "+c.date+" "+c.courses_Registered);
            }
        }

    }

}

【问题讨论】:

  • 创建一个Student和Teacher都实现的接口,然后只使用一个ArrayList
  • 真正的问题是,为什么要将两个列表都填充到一个地图中并将它们传递给一个方法?为什么不单独打印?

标签: java object arraylist hashmap


【解决方案1】:

一个简单的解决方案是在每个类上覆盖 toString()

public class StudentRecord {
    // fields, constructor etc.

    @Override
    public String toString() {
        return first_Name+" "+last_Name+" "+status+" "+date+" "+Arrays.toString(courses_Registered);  
    }
}

TeacherRecord 创建一个类似的方法。现在,在您的循环中,只需调用 System.out.println(c);,它将隐式打印您的 toString() 实现的结果。

此外,很多混乱是由于试图将包含不相关类型的列表强制转换为单个映射的结果。最简单的解决方案是单独打印每个列表:

void display() {
    student_arraylist.forEach(System.out::println);
    teacher_arraylist.forEach(System.out::println);
}

【讨论】:

  • @NimChimpsky 很抱歉你有这种感觉。
  • @kamalpreetkaur 请解释一下。
  • 我在 main ms.createSRecord("kamalpreet", "kaur", str, "active",new java.util.Date(System.currentTimeMillis()) ) 中运行了这段代码; ms.createTRecord("你好","再见","lhx","+123","mnt", "gf"); ms.display();但显示的输出是学生记录两次,如 kamalpreet kaur active Mon May 22 20:21:47 EDT 2017 [a, b] kamalpreet kaur active Mon May 22 20:21:47 EDT 2017 [a, b]
  • @kamalpreetkaur 您正在循环遍历map.entrySet(),但您的迭代器指向相同的student_arraylist,因此您看到的每个条目的值相同。
  • 它在代码中显示了学生记录两次 bcz 我在 student_arraylist 上调用了迭代器。
【解决方案2】:

让两个类都实现一个通用接口,例如

public interface PersonRecord {
String firstName();
String lastName();
...
}

public class StudentRecord implements PersonRecord
    { ... }

允许

List<PersonRecord> students = new List<>();
students.add(new StudentRecord());

【讨论】:

  • 这无济于事,除非 OP 只想打印公共字段,显然情况并非如此。
  • 确实需要您和@shmosel 答案的组合
  • 对不起,我不明白创建接口的目的,我应该在接口中包含哪些功能,因为两个类都有不同的数据
  • 但他们也有共同的数据和共同的方法
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2020-06-24
  • 2015-11-10
相关资源
最近更新 更多