【问题标题】:how to iterate through an object's list? [closed]如何遍历对象的列表? [关闭]
【发布时间】:2021-03-02 21:02:44
【问题描述】:

我目前在 Java 中遇到这个问题,假设我有一个类 ListOfTasks

public class ListOfTasks {
    private Point startingPoint;
    ArrayList<Task> tasks;
}

在另一个类中,我想通过调用 ListOfTasks 直接遍历数组列表 tasks,而不是先检索任务然后遍历它。

【问题讨论】:

    标签: java design-patterns iterator


    【解决方案1】:

    您可以通过实现Iterable 来返回数组列表的迭代器来做到这一点:

    public class ListOfTasks implements Iterable<Task> {
        private Point startingPoint;
        ArrayList<Task> tasks;
    
        public Iterator<Task> iterator() {
            return tasks != null ? tasks.iterator() : Collections.emptyIterator();
        }
    }
    

    然后您可以使用 for-each 进行迭代

    ListOfTasks list = new ListOfTasks();
    // add some tasks, etc...
    
    for (Task task : list) {
        // use task
    }
    
    // or
    
    list.forEach(task -> {
        // use task
    });
    

    【讨论】:

      【解决方案2】:

      有很多方法可以做到这一点:--

      在 ListOfTasks POJO 中写入 GETTER/SETTER。

      public class ListOfTasks {
          private Point startingPoint;
          ArrayList<Task> tasks = new  ArrayList<>();
      
          GETTER/SETTER
      }
      

      然后

      ListOfTasks list = new ListOfTasks();
      
      for(int i=0 ;i<list.getTask().size();i++){
      
      list.getTasks().get(i);
      }
      

      【讨论】:

        【解决方案3】:

        如果我理解你的问题,这样的事情应该可以工作:

        for (int i = 0; i < listOfTasksObject.tasks.size(); i++) {
            Task task = listOfTasksObjects.tasks.get(i);
            // Now you can work with task...
        }
        

        【讨论】:

          【解决方案4】:

          您采用的方法是错误的,因为“tasks”属性的责任归 ListOfTasks 类所有。

          所以你必须改变方法,遍历你在另一个类中的 ListOfTasks 实例集并调用一个方法,比如说

          public Task findTask() {
               // do something here to find the Task you were looking for, or return null
          }
          

          所以其他类应该是这样的:

          List<ListOfTasks> lists = new ArrayList<>();
          // populate list here ...
          Task found = lists.stream().filter(x => x.findTask()).filter(x => x != null).findAny().orElse(null);
          

          【讨论】:

            【解决方案5】:

            只是不要为任务暴露 getter。 在 ListOfTasks 类中创建一个方法,例如:

            public Task get(int index){
                return list.get(index);
            }
            public int size(){
                return list.size();
            }
            

            现在像这样使用 ListOfTasks

            for(int i=0 ;i<listOfTasks.size();i++){
            
                // now access Task like this
                listOfTasks.get(i);
            }
            

            【讨论】:

              猜你喜欢
              • 2019-12-30
              • 1970-01-01
              • 2017-12-10
              • 2012-12-18
              • 2016-05-06
              • 2021-11-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多