首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在自定义ArrayList中实现subList()

在自定义ArrayList中实现subList()方法,可以按照以下步骤进行:

  1. 创建一个自定义的ArrayList类,该类需要实现List接口,并继承AbstractList抽象类。
  2. 在自定义ArrayList类中添加一个私有内部类SubList,用于表示子列表。
  3. 在自定义ArrayList类中添加一个subList()方法,该方法接受起始索引和结束索引作为参数,并返回一个SubList对象。
  4. 在SubList类中实现List接口的所有方法,包括add()、remove()、get()、set()等方法。这些方法的实现需要基于原始ArrayList的数据进行操作。
  5. 在SubList类中重写size()方法,返回子列表的大小。
  6. 在SubList类中重写subList()方法,返回一个新的SubList对象,表示原始子列表的子列表。
  7. 在自定义ArrayList类中重写subList()方法,返回一个新的SubList对象,表示原始列表的子列表。

下面是一个示例代码:

代码语言:txt
复制
import java.util.AbstractList;
import java.util.List;

public class CustomArrayList<E> extends AbstractList<E> {
    private Object[] elements;
    private int size;

    public CustomArrayList() {
        elements = new Object[10];
        size = 0;
    }

    @Override
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        return (E) elements[index];
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public E set(int index, E element) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        E oldValue = (E) elements[index];
        elements[index] = element;
        return oldValue;
    }

    @Override
    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException();
        }
        if (size == elements.length) {
            resize();
        }
        System.arraycopy(elements, index, elements, index + 1, size - index);
        elements[index] = element;
        size++;
    }

    @Override
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        E oldValue = (E) elements[index];
        int numMoved = size - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elements, index + 1, elements, index, numMoved);
        }
        elements[--size] = null;
        return oldValue;
    }

    private void resize() {
        Object[] newElements = new Object[elements.length * 2];
        System.arraycopy(elements, 0, newElements, 0, size);
        elements = newElements;
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        if (fromIndex < 0 || toIndex > size || fromIndex > toIndex) {
            throw new IndexOutOfBoundsException();
        }
        return new SubList(fromIndex, toIndex);
    }

    private class SubList extends AbstractList<E> {
        private final int offset;
        private final int size;

        SubList(int fromIndex, int toIndex) {
            offset = fromIndex;
            size = toIndex - fromIndex;
        }

        @Override
        public E get(int index) {
            if (index < 0 || index >= size) {
                throw new IndexOutOfBoundsException();
            }
            return (E) elements[offset + index];
        }

        @Override
        public int size() {
            return size;
        }

        @Override
        public E set(int index, E element) {
            if (index < 0 || index >= size) {
                throw new IndexOutOfBoundsException();
            }
            E oldValue = (E) elements[offset + index];
            elements[offset + index] = element;
            return oldValue;
        }

        @Override
        public void add(int index, E element) {
            if (index < 0 || index > size) {
                throw new IndexOutOfBoundsException();
            }
            if (CustomArrayList.this.size == elements.length) {
                resize();
            }
            System.arraycopy(elements, offset + index, elements, offset + index + 1, size - index);
            elements[offset + index] = element;
            CustomArrayList.this.size++;
            size++;
        }

        @Override
        public E remove(int index) {
            if (index < 0 || index >= size) {
                throw new IndexOutOfBoundsException();
            }
            E oldValue = (E) elements[offset + index];
            int numMoved = size - index - 1;
            if (numMoved > 0) {
                System.arraycopy(elements, offset + index + 1, elements, offset + index, numMoved);
            }
            elements[offset + --CustomArrayList.this.size] = null;
            size--;
            return oldValue;
        }

        private void resize() {
            Object[] newElements = new Object[elements.length * 2];
            System.arraycopy(elements, 0, newElements, 0, CustomArrayList.this.size);
            elements = newElements;
        }

        @Override
        public List<E> subList(int fromIndex, int toIndex) {
            if (fromIndex < 0 || toIndex > size || fromIndex > toIndex) {
                throw new IndexOutOfBoundsException();
            }
            return new SubList(offset + fromIndex, offset + toIndex);
        }
    }
}

这样,你就可以在自定义ArrayList中使用subList()方法来获取子列表了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ArrayList分析2 :Itr、ListIterator以及SubList的坑

ArrayList分析2 : Itr、ListIterator以及SubList的坑 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/16409137.html...ArrayList实现就是ListItr与Itr,我们使用ListIterator或SubList的过程很少对ArrayList的操作,如果有那就很严重了(下面会说的),对源数组进行操作这是一个事实存在的问题...)的偏移操作,只不过一个是从0开始一个是从 offset + fromIndex;开始~,如果你还是存在怀疑,先看看SubListget`方法: public E get(int index...+ index);,很明白了吧,再看看SubListremove方法论证下当前这个小标题哈~ public E remove(int index) { rangeCheck...Itr、ListItr、SubList使用过程不可穿插ArrayList的相关操作(remove、add等),否则抛错 废话是多余的,先给个事故现场: public static void main

32530
  • 列表(List)数组实现(ArrayList类)

    列表(List)数组实现(ArrayList类)   JDK8源码,初始长度是10,每次数组扩展都增加1/2左右。...数组要在连续的空间里存储集合的元素,由于数据存储是连续的,因此支持用下标访问元素; 数组实现(Vector 类)   同样基于数组实现,会在内存开辟一块连续的空间来存储。...栈的数组实现:模仿ArrayList类,和栈相关的有两个元素,arrayList数组和topOfStack索引,初始状态topOfStack==-1,每次进栈一个元素x,topOfStack增1并令arrayList...集合(Set)   元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set的位置是由该元素的HashCode决定的,其位置其实是固定的)   Set接口有两个实现类:HashSet...和LinkedHashSet HashSet:(底层由HashMap实现),HashSet类按照哈希算法来存取集合的对象,存取速度比较快 ,存入HashSet的对象必须定义hashCode()和equals

    91200

    java之学习去除ArrayList重复自定义对象元素

    结果示意图: 前言: 很多时候或者很多项目中都会遇到集合重复的部分,如何去除这些重复的部分呢?接下来小编就用创建新集合的方式去除集合重复的部分。...原理: 原理就是创建新的集合 把旧的集合复制到新的集合来,做一个判断,如果插入新的集合存在旧的集合的元素就抛弃,如此循环添加,就可以去除掉重复的元素 注意:自定义对象重复,需要重写equals()方法...方法一: 利用新集合的方法去除重复java之学习去除ArrayList集合重复字符串元素方式 案例代码: package com.fenxiangbe.list; import java.util.ArrayList...al = getPerson(l1);   //调用方法去除重复 System.out.println(al); } public static ArrayList getPerson(ArrayList...System.out.println(“===========”); l1.remove(new Person(“张三”, 23)); //直接删除 System.out.println(l1); } 利用以上两种方法都可以删除自定义对象重复元素

    1.6K60

    Java按指定大小分割List集合

    技术博客:Java按指定大小分割List集合在日常的Java编程,处理大量数据集合时,我们经常会遇到需要将一个大集合分割成多个小集合的情况,以便于分批处理或并行处理。...今天,我们就来探讨如何在Java按指定大小分割List集合。需求分析假设我们有一个包含上万条数据的List集合,我们想要将其分割成多个子集合,每个子集合包含最多5000条数据。...实现方法为了完成这个任务,我们可以编写一个通用的方法,该方法接受一个List集合和一个指定的大小作为参数,然后返回一个包含多个子集合的List。...示例代码下面是一个简单的Java方法实现,用于按指定大小分割List集合:import java.util.ArrayList;import java.util.List;public class ListUtil...但结构性修改(添加、删除等)会抛出ConcurrentModificationException。因此,在大多数情况下,你可能需要将子列表复制一份再进行操作。

    14310

    何在SwiftUI实现interactiveDismissDisabled

    何在SwiftUI实现interactiveDismissDisabled 想获得更好的阅读体验,可以访问我的博客www.fatbobman.com[1] 本文中我们将探讨如何实现一个SwiftUI...去年9月,我在文章【在SwiftUI制作可以控制取消手势的Sheet】[3]中介绍了健康笔记2.0[4]版本的Sheet控制实现方法。...在今年推出的SwiftUI 3.0版本,苹果添加了一个新的View扩展:interactiveDismissDisabled,该扩展实现了上面的第一个要求——通过代码控制是否允许手势取消Sheet。...这种实现是我所喜欢的,也给了我很大的启发。 在WWDC 2021 观后感[6]一文,我们已经探讨过SwiftUI3.0将会影响非常多的第三方开发者编写SwiftUI扩展的思路和实现方式。...在之前的版本[8],用户使用手势取消时的通知和其他的逻辑是分离的,在使用不仅繁琐,而且影响代码的观感。本次将一并解决这个问题。

    3.9K40

    何在React Native添加自定义字体

    在这篇指南中,我们将探索使用 Google Fonts 在 React Native 应用添加自定义字体的方法。...让我们看看输出: 在Expo中使用自定义字体的React Native 在这一部分,我们将学习如何在Expo中使用自定义字体。...在我们的模拟器中看看这是什么样子: 使用自定义字体 假设你正在构建一个个人的 React Native 项目,并且你得到了一些自定义字体,这些字体并不在 Expo 支持的 Google 字体库。...性能影响:在React Native应用程序添加自定义字体时,请注意它们的文件大小(以kb/mb为单位)。大型字体文件可能会显著增加应用程序的加载时间,特别是在加载自定义字体时。...总结 本文所探讨的,将自定义字体集成到React Native应用程序不仅仅是技术上的提升,更是一种改善用户体验的策略性方法。

    45910

    Ryu:如何在LLDP添加自定义LLDPDU

    实现LLDP数据单元的拓展,本文将以Ryu控制器为例,介绍如何添加自定义的LLDPDU,从而满足多种业务的需求。 ?...switches.py文件的LLDPPacket类完成了LLDP数据包的初始化和序列化实现。 该类的lldp\_packet方法可以构造LLDP数据包,并返回序列化之后的数据。...HB', self.typelen, self.subtype) +self.vport_id 总结 LLDP协议可添加自定义TLV格式的特性,使其可以灵活地被修改,进而应用到不同的业务场景,十分方便...本文就以Ryu控制器为例,介绍了如何添加自定义LLDPDU的详细流程,希望对读者有一定的帮助。...此外,为计算时延,还可以通过switches模块的PortDatak类的发送时间戳来实现,无需修改LLDP数据包格式。如何在Ryu完成时延测试的内容将在下一篇文章详细介绍,敬请关注。

    2.7K60

    Android编程实现使用Intent传输包含自定义类的ArrayList示例

    本文实例讲述了Android编程实现使用Intent传输包含自定义类的ArrayList。...分享给大家供大家参考,具体如下: 前言 之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList...想实现对象的序列化,需要实现java.io.Serializable接口(注意,这个接口只是一个标记接口,并没有具体需要override的方法)。...ArrayList 之所以之前介绍了Serializable,是因为这是实现Intent传输的前提,ArrayList包含的自定义类必须实现Serializable接口才能通过putSerializable...还是用上面的Person类作为自定义的类,则第一个传递ArrayList的Activity关键代码如下: // Intent Creation and Initialization Intent passIntent

    59520

    何在Keras创建自定义损失函数?

    在本教程,我们将使用 TensorFlow 作为 Keras backend。backend 是一个 Keras 库,用于执行计算,张量积、卷积和其他类似的活动。...在这种情况下,设计一个定制损失函数将有助于实现对在错误方向上预测价格变动的巨大惩罚。 我们可以通过编写一个返回标量并接受两个参数(即真值和预测值)的函数,在 Keras 创建一个自定义损失函数。...实现自定义损失函数 ---- 现在让我们为我们的 Keras 模型实现一个自定义的损失函数。首先,我们需要定义我们的 Keras 模型。...你可以查看下图中的模型训练的结果: epoch=100 的 Keras 模型训练 结语 ---- 在本文中,我们了解了什么是自定义损失函数,以及如何在 Keras 模型定义一个损失函数。...然后,我们使用自定义损失函数编译了 Keras 模型。最后,我们成功地训练了模型,实现自定义损失功能。

    4.5K20

    【DB笔试面试511】如何在Oracle写操作系统文件,写日志?

    题目部分 如何在Oracle写操作系统文件,写日志? 答案部分 可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。...在CLIENT_INFO列存放程序的客户端信息;MODULE列存放主程序名,包的名称;ACTION列存放程序包的过程名。该包不仅提供了设置这些列值的过程,还提供了返回这些列值的过程。...如何在存储过程暂停指定时间? DBMS_LOCK包的SLEEP过程。例如:“DBMS_LOCK.SLEEP(5);”表示暂停5秒。 DBMS_OUTPUT提示缓冲区不够,怎么增加?...如何在Oracle写操作系统文件,写日志? 可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。...这个功能可以使用DBMS_ERRLOG包实现。 本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

    28.8K30

    何在Excel实现手写签名?

    前言 Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程,经常需要某一流程环节相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印出来...话不多说,先上效果图: 看完效果图之后,下面为大家介绍实现的详细过程。 使用Html+JavsScript实现手写签名的添加 1.实现Html界面 <!...document.getElementById("signArea")){ document.getElementById("signArea").style.visibility = 'visible' } } } (2) 追加右键自定义菜单...: 核心代码: // 追加自定义右键菜单 config.contextMenu.push("customeAddSign") config.commandMap = { customeAddSign...Excel单元格添加手写签名的功能,右键菜单选择手写签名后会调用对应的签名插件,在签名插件上可以用鼠标进行输入,输入完之后点击确认就会显示在单元格

    56530
    领券