【问题标题】:How can I print a list (employee type) using Iterator?如何使用 Iterator 打印列表(员工类型)?
【发布时间】:2012-11-01 10:01:27
【问题描述】:

员工类:

public class Employee {

    int empid;
    String name;
    int age;

    public Employee(int empid,String name,int age)
    {
        this.empid=empid;
        this.name=name;
        this.age=age;
    }
    public int getEmpid() {
        return empid;
    }
    public void setEmpid(int empid) {
        this.empid = empid;
    }
    public String getname() {
        return name;
    }
    public void setname(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    } 
}

比较器类:

public class Employee_comparator implements Comparator<Employee> {

    @Override
    public int compare(Employee object1, Employee object2) {
        return object1.getname().compareTo(object2.getname());
    }
}

主类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class Employee_Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        List<Employee> list=new ArrayList<Employee>();

        list.add(new Employee(33186,"varun",23));
        list.add(new Employee(33187,"deepak",23));
        list.add(new Employee(33188,"apple",23));
        list.add(new Employee(33189,"rohan",23));

        Collections.sort(list,new Employee_comparator());

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

            System.out.print("age:"+list.get(i).getAge());
            System.out.print("empid:"+list.get(i).getEmpid());
            System.out.println("name:"+list.get(i).getname());
        }

        Iterator<Employee> itr=list.iterator();

        while(itr.hasNext())
        {
            System.out.println(itr.next());
        }
    }
}

当我尝试使用 get 方法打印时,它工作正常。但是,当我尝试使用Iterator 打印列表的元素时,它会给出以下输出:

new_.Employee@28122812new_.Employee@280d280dnew_.Employee@28172817new_.Employee@28082808

【问题讨论】:

  • 您在答案中找到解决方案了吗?你可以接受一个!

标签: java iterator


【解决方案1】:

你可以在Employee类中实现一个方法toString():

public String toString(){
    return "Name: "+ this.name
       + ". Age:"+ this.age
       + ". Id:"+ this.empId; 
} //example

这样,当你这样做时:

System.out.println(itr.next());

它将打印员工的name、age 和id

【讨论】:

  • System.out.println(itr.next().toString());在那种情况下
  • 不需要显式调用toString(),无论如何它都会调用覆盖的toString()。
【解决方案2】:

因为itr.next() 具有类Employee 的返回对象,所以你在其中有很多。 试试

    Iterator<Employee> itr=list.iterator();

    while(itr.hasNext())
    {
        Employee employee = itr.next();

        System.out.print("age:"+employee.getAge());
        System.out.print("empid:"+employee.getEmpid());
        System.out.println("name:"+employee.getname());
    }

【讨论】:

    【解决方案3】:

    您正在打印 Employee 类对象而不是它的值,

    试试:

    Iterator<Employee> itr=list.iterator();
    
    while(itr.hasNext())
    {
        //System.out.println(itr.next());
        System.out.println(itr.next().getEmpid());
    }
    

    之间,使用增强的for循环,比迭代器快。

    编辑:

    增强的 for 循环比 Iterator 更具可读性。而 Iterator 为您提供了使用 iterator.remove() 方法删除值的选项。如果您在循环期间尝试更新列表,for 循环将引发 ConcurrentModificationException。

    【讨论】:

    • 真的更快吗?证明它
    • @dantuch:啊,我的意思是比迭代器更好的可读性。无论如何,增强的 for 循环可以用更少的行(或字符)编写,这样它至少更快(打字):)
    【解决方案4】:

    您可以使用以下代码在 Java 8 中执行相同操作

    Iterator<Employee> employees = list.iterator(); employees.forEachRemaining(System.out::println);

    或者简单地说,

    list.iterator.forEachRemaining(System.out::println);

    【讨论】:

      【解决方案5】:

      重写toString 方法,这样即使调用了Employee 方法,您也可以获得Employee 的详细信息。

      public void toString(){
       return "Employee Id: "+empid+" Name: "+name+" Age: "+age;
      }
      

      现在当您调用itr.next() 时,您的Employee 类toString 方法被调用,现在它将返回您在覆盖的toString 方法中创建的String。

      【讨论】:

        【解决方案6】:

        您的 itr.next() 包含员工对象,它将打印 toString() 方法。由于您没有覆盖 String 方法,因此您得到了这个。您可以根据需要覆盖 String 方法和

        System.out.println(itr.next());
        

        将打印 toString() 方法中的内容。

        这将在您的 Employee 类中

         @Override
        public String toString() {
            return "Employee [empid=" + empid + ", name=" + name + ", age=" + age + "]";
        }
        

        【讨论】:

        • System.out.println(itr.next().toString());在那种情况下
        • @Ankit 不,无论如何它都会调用覆盖的toString()
        【解决方案7】:

        你应该在你的类中添加一个 Employee 方法:

        public void printEmploee()
        {
          System.out.printf("ID:%s \nName: %s \nAge: %s \n",
          this.id, this.name, this.age);
        }
        

        然后使用迭代器:

        Iterator<Employee> itr = list.iterator();
        while (itr.hasNext()) {
        itr.next().printEmploee();
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-03
          • 2021-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-11
          • 1970-01-01
          • 2022-01-14
          相关资源
          最近更新 更多