为什么Java集合API没有最后一种方法?[关闭]


19

这用于有序集合,例如java.util.List。语言设计者为什么不包括最后一种方法?我能想到的唯一原因是:

  • 集合为空时的歧义(返回null或引发异常)
  • API膨胀

还有其他原因吗?


9
我不得不写的次数是+1 collection.get(collection.size() - 1)
jprete 2011年

1
为什么不编写自己的实用程序类,该类具有此方法以及您可能想与集合一起使用的任何其他方法?
Mahmoud Hossam,

7
也没有first()方法,那么为什么要有last()方法呢?
彼得·泰勒

6
@Peter urgh比未实现getLast()更糟糕的是,它会像get(-1)这样的hack来实现。
Alb

2
@Alb我猜想是“旁观者” :)在这一点上,我很欣赏python -1的语法。当然,如果您在将来或过去的某个时间再次问我,我可能会和您一样。
2012年

Answers:


13

API膨胀可能是答案。根据我的经验,只有在我需要此功能时,队列或堆栈才是具有适当方法的作业的正确数据结构。


猜测您是部分正确的,但是如果Java支持get(-1)从列表末尾进行检索,那么它将执行OP所需的操作而无需添加API膨胀。因此,我的回答引起了无法解释的批评。
user949300 2014年

1
我认为更大的答案是Java最初的失败(在.NET中重复,并且在后一种情况下仍在继续),以支持默认接口方法,这意味着让接口包含一个成员,其中99%的实现将以相同的方式处理该成员,这将带来额外的工作量在所有实现上受益于少数会以不同方式实现它们的利益。
2015年

16

一个last()方法是一样简单list.get(list.size()-1),就像没有任何first()方法或fifth()方法。合成起来并不难,是一种专业。您还可以reverse()列出并list.get(0)给出last项目。容易做的事情通常没有自己的专门方法。

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

产生以下输出

l.get(0) = A
l.get(l.size()-1) = Z

假定实现List接口的所有内容实际上都具有last()任何东西的概念也很冒昧。


1
不过,这两种情况都更加清楚
Anto

请注意,如果集合尚未完全填充,则size()方法可能无法回答。

1
.size()将返回当前大小,.size()-1无论该大小如何仍将是最后一个元素,怎么知道它是否已完全填充?

1
根据规范,一个List可以包含多个Integer.MAX_VALUE元素,在这种情况下,size()返回Integer.MAX_VALUE,因此.size()-1不是一种完美的实现方式last()(尽管如此大的列表不太可能实现,我想知道这样一个列表如何将实现toArray()...)
user281377'5

1
C#确实具有.First和.Last方法。反转列表以仅获取最后一个项目也不是完全有效。
卡拉

5

java.util.LinkedList定义getLast()getFirst()方法。不幸的是,这些方法未在其接口之一中定义,因此您必须使用LinkedList类型。如果仅对最后一个元素感兴趣,则可以考虑使用java.util.Queue接口的peek()方法。LinkedList实现Queue。


0

基本上,你要么必须索要size()for-loop或迭代它通过请求其迭代器并使用它在一段时间或做循环。使用适合您目的的一种。

迭代器在给定的点知道是否有更多条目,如果有,则允许您获取下一个条目。然后重复直到“更多条目?”。失败。

请参阅http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html上的“遍历集合”部分


这不是问题的答案。使用迭代器查找列表中的最后一个元素也非常无效。
fishinear
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.