是否可以使用不同数据类型的元素遍历数组列表并将其删除?

时间:2017-06-08 15:57:30

标签: java loops arraylist iteration output

如果没有泛型,可以使用不同类型的元素创建ArrayList。我想迭代它并推出元素。我不能使用for-each-loop,因为它需要特定类型。我试过了Iterator但是没有成功。

所以我有两个问题:

  1. 是否可以遍历数组列表并推出(例如使用System.out.println所有元素,无论它们属于哪种类型?

  2. 是否可以遍历数组列表,并且只输出 类型特定类型的元素(例如只有字符串)?

6 个答案:

答案 0 :(得分:3)

Sure!

The toString method is defined on the Object class. The Object class is the base class of every user-defined class. You could easily write:

for (Object item: itemList) {
    // prints all items    
    System.out.println(item);
    if (item instanceof YourDesiredClass) { 
        YourDesiredClass specificItem = (YourDesiredClass) item;
        //doSomethingElse(specificItem)
    }
}

答案 1 :(得分:3)

  

是否可以遍历数组列表并输出(例如,   与System.out.println)所有元素无论哪种文件类型   他们是?

是的,您可以使用Object类

List<Object> myList = new ArrayList<>();
myList.add("Hello World"); // string
myList.add(Math.PI); // a double
myList.add(188); // an int
myList.add(9099099999999L); // a Long
// for java8
myList.forEach(System.out::println);
//before java8
for (Object object : myList) {
    System.out.println(object);
}
  

是否可以遍历数组列表并仅输出   具有特定文件类型的元素(例如只有字符串)?

是的,您可以使用迭代器并让Object根据您需要的类进行检查....

    Iterator<Object> it = myList.iterator();
    while (it.hasNext()) {
        Object x = it.next();
        if (x instanceof String) {
            System.out.println("this is a String: " + x);
        }
    }

答案 2 :(得分:3)

据我所知,是的。

你可以创建包含Objects的ArrayList(参见Java类Object),因为你在Java中定义的每个类至少扩展了一个顶级类Object。

现在让我回答你的问题:

  1. 是的,确实如此。列表中的每个对象都知道它是哪个类的实例,并且具有方法toString()。当您浏览ArrayList并为每个对象调用toString()时,将调用最具体的方法toString()。例如,如果它是Integer的实例(让它说它被称为数字)并将它转换为Object,请调用number.toString();,尽管编译器现在将该数字视为对象,它将从Integer类调用toString()方法。这称为动态多态性

  2. 是的,你可以检查哪个类是Object的实例。这些对象中的每一个都有这些信息;将它转换为Object类就像对编译器说的那样#34;这里有一些对象,我希望你把它看作类Object的实例&#34; - 就像把眼镜放到编译器上一样。 对象知道它是哪个类,所以你可以问,例如:

    if(myObject instanceof String){
         //do something;
    }
    
  3. 希望它有所帮助,我试图以最好的方式解释它,以便你了解发生了什么&#34;引擎盖下&#34; :)

答案 3 :(得分:2)

  1. 只是对象

    new ArrayList<Object>().iterator().forEachRemaining(element -> {
        System.out.println(element);
    });
    
  2. 特定类型

    new ArrayList<Object>().stream().filter(element -> element instanceof String).iterator()
            .forEachRemaining(System.out::println);
    
  3. 编辑:这个答案需要Java 8

答案 4 :(得分:1)

  

是否可以遍历数组列表并将所有元素(例如,使用System.out.println)放出来,无论它们属于哪种文件类型?

当然,您可以迭代Object类的列表(或arraylist)并执行您需要的操作。

  

是否可以遍历数组列表并仅输出特定文件类型的元素(例如只有字符串)?

是的,您可以使用instanceof并针对特定类别执行特定操作。

用法示例:

List<Object> genericList = new ArrayList<>();
genericList.add("test");
genericList.add(2);
genericList.add('c');

for (Object object: genericList) {
    // "Put" out object (question 1)    
    System.out.println(object);
    // Check object type (question 2)
    if (object instanceof AnyClass) { 
        //doSomething()
    }else if (object instanceof AnotherClass){
        //doSomethingElse()
    }
}

答案 5 :(得分:0)

您始终可以使用所有对象共有的类型。最后一个将始终是Object,因为每个Class都扩展了Object。

但是既然我们不喜欢施展它,那么主要是建立一个基本类的更好方法:

public abstract class FileType
{
    public abstract String getTypeName();
    public abstract String getTypeDescription();
}

public class JSON extends FileType
{
    @Override
    public String getTypeName()
    {
        return "JSON";
    }

    @Override
    public String getTypeDescription()
    {
        return "JavaScript Object Notation";
    }
}

public class TXT extends FileType
{
    @Override
    public String getTypeName()
    {
        return "TXT";
    }

    @Override
    public String getTypeDescription()
    {
        return "Textfile";
    }
}

现在你可以创建一个FileType列表并使用它的方法:

List<FileType> fileTypes = new ArrayList<>();
list.add(new JSON()); // JSON fits good in here
list.add(new TXT()); // TXT also

for (FileType fileType : list)
{
    System.out.println(fileType.getTypeName()); // have the FileType-Methods savely available
}