【问题标题】:How to properly return part of ArrayList in Java?如何在 Java 中正确返回 ArrayList 的一部分?
【发布时间】: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 方法。你可以使用它。

标签: java arraylist sub-array


【解决方案1】:

【讨论】:

    【解决方案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 并将其返回,但这将涉及复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2018-10-20
    • 2023-03-10
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多