【问题标题】:Java: Pick out multiple elements in Linked listJava:在链表中挑选多个元素
【发布时间】:2015-01-21 08:46:15
【问题描述】:

我有一个包含 3 个字符串和一个双精度的类的链接列表。我想收集列表中每个双精度的总值。例如

 LinkedList<Person> L = new LinkedList<Person>();
 Person p1 = new Person("Fee","Foo","Bar", 1.2);
 Person p2 = new Person("Fi","Fi","Fo", 2.5);
 L.add(p1);
 L.add(p2);

我想找到 1.2 和 2.5 并将其相加。我假设我应该使用 ListIterator,但我如何告诉它将每个找到的双精度值添加到总数中?

【问题讨论】:

  • 澄清一下:您是在问如何迭代列表吗?
  • 不,我知道迭代,我只想从具有不同数据类型的列表中挑选特定元素。
  • 列表只包含一种类型:Person。

标签: java list linked-list listiterator


【解决方案1】:

你有几个选项可以迭代它

A) 按要求使用迭代器

Person person = new Person();
ListIterator<Person> listIterator = L.listIterator();

while (listIterator.hasNext()) {
      person = listIterator.next();
      double value = person.getDoubleAttribute();
}

B)按照其他答案中的建议使用for-each 循环:

for(Person person : L){
    double value = person.getDoubleAttribute();
}

PS:非常不鼓励以UPPERCASE 开头的Java 变量或属性

【讨论】:

  • 我知道你会恨我的 ;),但是说到内存使用,将Person person = ... 放在循环之外不是更好吗?因为现在它在每次迭代中都会保留新的内存空间?
【解决方案2】:

只需对这些人使用 for 循环:

double sum = 0;
for(Person p : L)
    sum += p.getDouble();
System.out.print(sum);

【讨论】:

  • 我认为您的方法比公认的答案更好;)但是由于扩展循环时错误率增加,应避免跳过括号。见stackoverflow.com/questions/8020228/…
  • @KnutKnutsen 使用for each 循环可能是最简单的方法,但不是最佳方法。 OP还要求Iteratorin LinkedList...
  • @JordiCastilla 为什么不是最优的?当然,他要求Iterator,但据我所知,for-each 循环将在内部转换为类似的方法。甚至 Oracle 也支持使用 for-each,请参阅 docs.oracle.com/javase/7/docs/technotes/guides/language/…
  • @JordiCastilla PS:我不是说你的答案是错误的,但不是那么漂亮;)
  • @KnutKnutsen 内部转换就是不太理想的意思;)...无论如何,我完全同意你的观点,我不喜欢Iterators,代码不太清楚,但它们是更好的内存使用...
【解决方案3】:

您可以遍历列表,获取每个 Person 的 double 属性并将它们相加,或者您可以使用 Java 8 Streams:

double sum = L.stream().mapToDouble(Person::getDoubleProperty).sum();

其中getDoubleProperty 代表Person 类中返回双精度值的方法的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2021-01-03
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多