【问题标题】: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,但没有成功。

所以我有两个问题:

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

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

【问题讨论】:

  • 你是什么意思“淘汰”?另请注意,将不同的类型放在一个列表中几乎总是一个坏主意,除非它们都共享一个公共接口/超类。
  • 我的意思是放出 e。 G。在控制台上使用 System.out.println。对不起,如果我的英语不清楚。
  • 在 Java 中,您始终可以使用 Object 作为类型。每个自定义类都扩展 Object。因此,您可以使用列表List<Object> yourList 并像这样循环遍历它:for (Object obj : yourList)。您应该始终使用对象共有的最高实现,以便您可以使用它们共有的所有内容
  • 能否提供代码示例?
  • “文件类型”是什么意思?

标签: java loops arraylist iteration output


【解决方案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】:
    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);
      

    编辑:此答案需要 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。

        现在让我回答你的问题:

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

        2. 是的,您可以检查哪个类是 Object 的实例。这些对象中的每一个都有该信息;将其转换为 Object 类就像对编译器说“这里有一些对象,我希望你把它看作是 Object 类的一个实例”——就像给编译器戴上眼镜一样。 并且object知道它是哪个类,所以你可以问,例如:

          if(myObject instanceof String){
               //do something;
          }
          

        希望它有所帮助,我试图以最好的方式解释它,以便您了解“幕后”发生了什么:)

        【讨论】:

          【解决方案5】:

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

          当然,您可以迭代 Objectclass 的列表(或数组列表)并执行您需要的操作。

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

          是的,您可以使用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
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-12-05
              • 1970-01-01
              • 1970-01-01
              • 2020-12-09
              • 2012-09-14
              相关资源
              最近更新 更多