【问题标题】:How to iterate a class in ArrayList?如何在 ArrayList 中迭代一个类?
【发布时间】:2016-03-22 09:49:45
【问题描述】:
import java.util.*;
class Animal{
String dog; String cat;
}
public class Arraylist {
 public static void main (String[] args) {

     Animal var=new Animal();
     var.dog="german";
     var.cat="persian";

     List <Animal> al=new ArrayList<Animal>();
     al.add(var);

     Iterator itr= al.listIterator();
     while(itr.hasNext())
     {System.out.print(", "+ itr.next());}
   }
}

现在我想迭代类的元素。我怎么能那样做? 谢谢!

【问题讨论】:

  • 你的类应该实现Iterable接口。
  • iterate the elements of the class是什么意思?
  • 要做的第一件事:将您的课程从 Arraylist 重命名为与 ArrayList 更明显不同的名称...
  • 就像我想打印我在arraylist中作为一个类添加的德语和波斯语。如何打印?

标签: java class arraylist collections iterator


【解决方案1】:

我知道您的问题已经解决,但我想提出一个解决方案和一些建议,以便您可以编写更好的 Java 代码。

首先,Arraylist 这个名字不好。由于内置Java.Util ArrayList 类可能会导致误解,最重要的是它没有描述它的作用!您打算将其用作Animal 对象的容器吗?然后你可以将这个类命名为 AnimalList。您是否尝试提供 ArrayList 的实现(可能比在 java ArrayList 中构建更轻量级)?然后选择一个更通用的名称来描述此列表并使用泛型!

您最好将 Animal 类放在另一个源文件中,但我假设您已经这样做了,这样在此处粘贴会更容易。

关于 Iterator 部分,您应该实现 Iterable 接口(就像 java util ArrayList 所做的那样),然后返回一个 Iterator。您声称要遍历该类的元素。但是你的课没有元素!!您只有一个动物容器,其范围仅在 main 方法中。您应该在您的类中添加一个容器,并在该容器中添加一些动物。

关于toString方法,你看到的那个Animal@2a139a55就是Animal Object的内存地址。当您想要打印您创建的类时,这是 toString 方法的默认操作。如果你尝试从一个 java 库中打印一个类,你会发现他们很可能重写了 toString 方法来打印更有用的东西。

总而言之,使用调整数组大小的最小 ArrayList 实现(我保留了你的名字 Arraylist)可以是:

import java.util.Iterator;
import java.util.NoSuchElementException;

class Animal{
    String dog;
    String cat;

    @Override
    public String toString() {
        return "Dog: " + dog + "\nCat: " + cat + "\n\n";
    }
}


public class Arraylist<Item> {

    public  Item list[];
    private int N = 0;


    public Arraylist() {
        list = (Item[]) new Object[2];
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    private void resize(int max) {
        Item[] temp = (Item[]) new Object[max];
        for (int i = 0; i < N; i++) {
            temp[i] = list[i];
        }
        list = temp;
    }

    public void add(Item item) {
        if (N == list.length)
            resize(2 * list.length);
        list[N++] = item;
    }

    public Item remove() {
        if (isEmpty())
            throw new NoSuchElementException();
        Item item = list[N-1];
        list[N-1] = null;
        N--;
        if (N > 0 && N == list.length/4)
            resize(list.length/2);
        return item;
    }



    public Iterator<Item> iterator() {
        return new ArraylistIterator();
    }


    private class ArraylistIterator implements Iterator<Item> {

        private int current = 0;

        private ArraylistIterator() {
            current = 0;
        }

        @Override
        public boolean hasNext() {
            return (current != N);
        }

        @Override
        public Item next() {
            if (hasNext())
                return list[current++];
            throw new NoSuchElementException();
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }


    public static void main (String[] args) {

        Animal var=new Animal();
        Animal var2=new Animal();
        Animal var3=new Animal();
        Animal var4=new Animal();

        var.dog="german";
        var.cat="persian";
        var2.dog="german1";
        var2.cat="persian1";
        var3.dog="german2";
        var3.cat="persian2";
        var4.dog="german3";
        var4.cat="persian3";

        Arraylist al = new Arraylist();

        al.add(var);
        al.add(var2);
        al.add(var3);
        al.add(var4);


        Iterator itr= al.iterator();
        while(itr.hasNext())
        {
            System.out.print(itr.next());
        }
    }
}

希望对你有帮助!!

【讨论】:

    【解决方案2】:

    你正在迭代你的类的元素。

    我看到了一些潜在的问题:

    1. 将您的课程从 Arraylist 重命名为其他名称,与 java.util.ArrayList 不太相似。

    2. Iterator itr=...更改为Iterator&lt;Animal&gt; itr=...

    3. 如果您的 Animal 类没有覆盖 toString,它应该。否则System.out.print(", "+ itr.next()) 不会打印有意义的输出。

    关于第三点。添加到您的 Animal 类(并可能添加到该类的子类,具体取决于您希望打印的内容):

    @Override
    public String toString ()
    {
        return "someStringThatRepresentsTheStateOfYourAnimalObject";
    }
    

    【讨论】:

    • 它仍在打印“, Animal@2a139a55”。你能告诉我你的第三点吗?我不明白。
    • @Murtaza 这意味着您没有覆盖toString。见编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2012-10-05
    • 2011-09-01
    • 2020-12-04
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多