如何在 Java 中正确返回 ArrayList 的一部分?

Posted

技术标签:

【中文标题】如何在 Java 中正确返回 ArrayList 的一部分?【英文标题】:How to properly return part of ArrayList in Java? 【发布时间】:2016-04-16 07:44:41 【问题描述】:

我有一个类 SomeClass 和一个静态成员 myMap enter code here,其形式为 HasmMap<String,ArrayList<SomeOtherClass>>,它从文件中反序列化。

我有办法

public ArrayList<SomeOtherClass> getList(final String key, final int N)

应该在映射中查找key 并返回相应ArrayList 的第一个N 元素,或者如果列表具有&lt;= N 元素,则返回整个内容。我应该如何实现下面的TODO 行:

public ArrayList<SomeOtherClass> getList(final String key, final int N)

    ArrayList<SomeOtherClass> arr = myMap.get(key);
    if (arr == null) return null;

    if (arr.size() <= N)
    
       return arr;
    
    else
    
       // TODO: return first N elements
    

要高效地执行此操作,即在实际返回正确数据的同时不在内存中创建不需要的副本?

【问题讨论】:

有一个subList 方法。你可以使用它。 【参考方案1】:
return arr.subList(0, N);

文档是你的朋友。

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#subList(int,%20int)

【讨论】:

【参考方案2】:

使用Lists subList method 创建一个子列表。

返回此列表在指定 fromIndex(包括)和 toIndex(不包括)之间部分的视图。

返回的列表是由这个列表支持的,所以返回列表中的非结构性变化会反映在这个列表中,反之亦然。

从索引 0(包含起始索引)开始,到索引 N(不包含结束索引)结束。

return arr.subList(0, N);

这不会将项目复制到新列表;它返回现有列表的列表视图。

【讨论】:

我收到java.util.ArrayList$SubList cannot be cast to java.util.ArrayList。我可以用return new ArrayList&lt;SomeOtherClass&gt; arr.subList(0, N); 替换return arr.subList(0, N);,但我会创建一个副本,对吧? 这是因为subList 返回的List 不是ArrayList。您可以让您的方法返回 List 而不是 ArrayList。或者,您可以从子列表中创建一个 ArrayList 并将其返回,但这将涉及复制。

以上是关于如何在 Java 中正确返回 ArrayList 的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java ArrayList中返回第一个最大值

如何正确填充类型为ArrayList?的ArrayList

JAVA : ArrayList和数组的转换

在 Java 中不使用 Arraylist 的情况下为类制作动态数组,并且没有正确教授如何去做

当作为参数传递给返回 void 并在函数中修改的函数时,如何修改 Java ArrayList?可能对按值传递感到困惑

在Java中,ArrayList与数组如何相互转换,写出例子