是否可以遍历具有不同数据类型元素的数组列表并将它们输出?
Posted
技术标签:
【中文标题】是否可以遍历具有不同数据类型元素的数组列表并将它们输出?【英文标题】:Is it possible to iterate through an array list with elements of different data types and put them out? 【发布时间】:2017-11-10 10:47:26 【问题描述】:如果没有泛型,则可以使用不同类型的元素创建 ArrayList
。我想遍历它并取出元素。我不能使用 for-each-loop,因为它需要一个特定的类型。我尝试了Iterator
,但没有成功。
所以我有两个问题:
是否可以遍历数组列表并输出(例如使用System.out.println
)所有元素,无论它们是哪种类型?
是否可以遍历数组列表并仅输出特定类型的元素(例如,仅字符串)? p>
【问题讨论】:
你是什么意思“淘汰”?另请注意,将不同的类型放在一个列表中几乎总是一个坏主意,除非它们都共享一个公共接口/超类。 我的意思是放出 e。 G。在控制台上使用 System.out.println。对不起,如果我的英语不清楚。 在 Java 中,您始终可以使用 Object 作为类型。每个自定义类都扩展 Object。因此,您可以使用列表List<Object> yourList
并像这样循环遍历它:for (Object obj : yourList)
。您应该始终使用对象共有的最高实现,以便您可以使用它们共有的所有内容
能否提供代码示例?
“文件类型”是什么意思?
【参考方案1】:
当然!
toString
方法是在 Object
类上定义的。 Object
类是每个用户定义类的基类。你可以很容易地写:
for (Object item: itemList)
// prints all items
System.out.println(item);
if (item instanceof YourDesiredClass)
YourDesiredClass specificItem = (YourDesiredClass) item;
//doSomethingElse(specificItem)
【讨论】:
【参考方案2】:只是对象
new ArrayList<Object>().iterator().forEachRemaining(element ->
System.out.println(element);
);
特定类型
new ArrayList<Object>().stream().filter(element -> element instanceof String).iterator()
.forEachRemaining(System.out::println);
编辑:此答案需要 Java 8
【讨论】:
【参考方案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);
是否可以遍历数组列表并仅输出 属于特定文件类型的元素(例如,只有字符串)?
是的,您可以使用迭代器并让对象根据您需要的类检查它......
Iterator<Object> it = myList.iterator();
while (it.hasNext())
Object x = it.next();
if (x instanceof String)
System.out.println("this is a String: " + x);
【讨论】:
【参考方案4】:据我所知,是的。
您可以使ArrayList
包含对象(请参阅Java 类对象),因为您在Java 中定义的每个类至少扩展了作为***类的类Object。
现在让我回答你的问题:
是的,是的。列表中的每个对象都知道它是哪个类的实例并具有方法toString()
。当您滑动 ArrayList 并为每个对象调用 toString()
时,将调用最具体的方法 toString()
。例如,如果它是 Integer 的实例(假设它被称为数字)并且您将其转换为 Object,请调用 number.toString();
,尽管编译器现在将该数字视为 Object,但它会从 Integer 类调用 toString()
方法。这就是所谓的动态多态性
是的,您可以检查哪个类是 Object 的实例。这些对象中的每一个都有该信息;将其转换为 Object 类就像对编译器说“这里有一些对象,我希望你把它看作是 Object 类的一个实例”——就像给编译器戴上眼镜一样。 并且object知道它是哪个类,所以你可以问,例如:
if(myObject instanceof String)
//do something;
希望它有所帮助,我试图以最好的方式解释它,以便您了解“幕后”发生了什么:)
【讨论】:
【参考方案5】:是否可以遍历数组列表并输出(例如使用 System.out.println)所有元素,无论它们是哪种文件类型?
当然,您可以迭代 Object
class 的列表(或数组列表)并执行您需要的操作。
是否可以遍历数组列表并仅输出特定文件类型的元素(例如,仅字符串)?
是的,您可以使用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()
【讨论】:
【参考方案6】:您始终可以使用所有对象共有的类型。最后一个永远是 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";
现在您可以制作一个文件类型列表并使用它的方法:
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
【讨论】:
以上是关于是否可以遍历具有不同数据类型元素的数组列表并将它们输出?的主要内容,如果未能解决你的问题,请参考以下文章