【问题标题】:Return items from ArrayList从 ArrayList 返回项目
【发布时间】:2014-09-02 17:18:34
【问题描述】:

这看起来很简单,但我要做的就是将 ArrayList 中的项目作为字符串返回 我使用以下代码返回它们,但它只返回列表中的第一项,我希望它单独返回每个项目。不知道我在做什么我让它工作但不小心删除了它。

public String getEachEmployeeInstance() {


        for (Employee e : employees)
        {  

             return e.getFirstName() +"\t" + e.getLastName() +"\t"+ e.getEmployeeIDString()+"\t" + e.getPunchIn() +"\t"+ e.getPunchOut() +"\t"+ e.getDailyHours() +"\t"+ e.getWeeklyHours();  
        }         
        return null;            
    }

【问题讨论】:

  • 它只返回列表中的第一项,因为您在循环中return。这会导致getEachEmployeeInstance 立即结束,而不是结束循环。
  • 退货后你想对它们做什么?
  • 好的,我明白了。那么如何让它继续循环并返回字符串呢?我想我需要不带括号返回?
  • 一个方法只能返回一个对象。
  • 您希望他们返回的哪里?

标签: java


【解决方案1】:

看起来您正在寻找与 Python 的 yield 关键字等效的 Java。 Java 没有内置此功能。

当您说return 时,您是在告诉Java 退出函数并返回当前元素。循环的其余部分不运行。

如果您真的想要 Java 中的生成器功能,您可能需要考虑查看 this answer 中提到的库。

对于这个特定的用例,只需维护一个Iterator 或集合中的一个索引并在每次调用函数时引用这个对象就足够了。

Iterator<Employee> myEmployeeIterator = null;

public String getEachEmployeeInstance() {
    if (myEmployeeIterator == null) 
        myEmployeeIterator = employees.iterator();

    if (myEmployeeIterator.hasNext()) {
        Employee e = myEmployeeIterator.next();
        return e.getFirstName() +"\t" + e.getLastName() +"\t"+ e.getEmployeeIDString()+"\t" + e.getPunchIn() +"\t"+ e.getPunchOut() +"\t"+ e.getDailyHours() +"\t"+ e.getWeeklyHours();  
    }

    return null;            
}

另一种可能性是 OP 实际上只是希望循环中的串联输出(由换行符分隔)显示在他的 GUI 组件中。这可以通过StringBuilder 轻松实现。

public String getEachEmployeeInstance() {

    StringBuilder sb = new StringBuilder();
    for (Employee e : employees)
    {  
        sb.append(e.getFirstName() +"\t" + e.getLastName() +"\t"+ e.getEmployeeIDString()+"\t" + e.getPunchIn() +"\t"+ e.getPunchOut() +"\t"+ e.getDailyHours() +"\t"+ e.getWeeklyHours());  
        sb.append("\n");
    }         
    return sb.toString();            
}

【讨论】:

  • 如何让它继续而不是退出?
  • @user3682269, 将其包装在一个类中,并在该类中存储一个索引。然后每次返回时递增索引,这样下次调用就会得到下一个索引。
  • @merlin2011 完全正确。看看the implementation of ArrayList's Iterator(内部类名为Itr)。它就是这样做的。
  • 我想我已经用 ID 做到了,但我需要一些方法将值返回给 jTextPane,我使用 System.out.println 到控制台但现在需要它去 jTextPane .
  • 就是这样!谢谢!
【解决方案2】:

它只将第一个元素作为字符串返回,因为您将return 作为 for 循环中的第一条语句。

如果你想返回一个字符串列表。您需要执行以下操作:

public List<String> getEachEmployeeInstance() {
    List<String> employeeList = new ArrayList<>;

    for (Employee e : employees)
    {  
         employeeList.add( e.getFirstName() +"\t" + e.getLastName() +"\t"+ e.getEmployeeIDString()+"\t" + e.getPunchIn() +"\t"+ e.getPunchOut() +"\t"+ e.getDailyHours() +"\t"+ e.getWeeklyHours());  
    }         
    return employeeList;            
}

另一方面,如果您想返回 yield,您可以使用此项目中的 YieldUtils

https://code.google.com/p/java-yield/

【讨论】:

  • 你认为你的方法有意义吗?
  • @PM77-1 对不起,我的朋友,你能告诉我更多细节吗?
  • 我认为他的意思是你可以用return employees替换整个函数,并改变接口返回一个Collection。
  • 是的。为什么有人想要获取对象列表并返回字符串列表。你能想出一个合理的用例吗?
  • @merlin2011 我不明白这个问题。 OP 说return items from an ArrayList as Strings 和`我希望它单独返回每个项目`。我认为 OP 在 java 中是新的,正如他所说,他想做一件非常简单的事情。
【解决方案3】:

您似乎想将返回的字符串传递给另一个接受单个字符串(而不是数组或字符串列表)的方法。如果是这样,您可能不需要getEachEmployeeInstance() 方法:

for(Employee employee : employees) {
    anotherMethod(employee.getFirstname() /* ... */);
}

【讨论】:

  • 好的,这是有道理的。我会尝试创建另一种方法。基本上我认为我需要另一种方法让 jTextPane 做到这一点。谢谢
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2016-08-14
  • 2014-04-23
  • 2017-07-17
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多