首页 > 编程语言 >JS 模拟 Java 动态数组(类)

JS 模拟 Java 动态数组(类)

时间:2023-06-07 13:44:44浏览次数:43  
标签:index return el param JS 数组 Java data size

 Code:

/**
 * 动态数组
 * @class
 */
var DArray = (function() {
  /**
   * 数据数组
   * @type {*[]}
   */
  let data;

  /**
   * 数组中的元素个数
   * @type {number}
   */
  let size;

  /**
   * 调整数组容器大小
   * @param {number} new_capacity
   */
  const resize = new_capacity => {
    const newData = new Array(new_capacity);
    for (let i = 0; i < size; i++) {
      newData[i] = data[i];
    }
    data = newData;
  };

  /**
   * 内部动态数组类
   * @class
   */
  class _DArray {
    /**
     * 构造器
     * @constructor
     * @param {number} capacity
     */
    constructor(capacity = 10) {
      data = new Array(capacity);
      size = 0;
    }

    /**
     * 获取数组容量
     * @return {number} 
     */
    get_capacity() {
      return data.length;
    }

    /**
     * 获取现有元素的个数
     * @return {number} 
     */
    get_size() {
      return size;
    }

    /**
     * 个数是否为空
     * @return {boolean} 
     */
    is_empty() {
      return size === 0;
    }

    /**
     * 往指定位置添加元素
     * @param {number} index 
     * @param {*} newEl 
     */
    add(index, newEl) {
      if (index > size || index < 0) {
        throw new RangeError('操作越界!');
      }

      if (size === data.length) {
        resize(2 * data.length);
      }

      for (let i = size - 1; i >= index; i--) {
        data[i + 1] = data[i];
      }

      data[index] = newEl;

      size++;
    }

    /**
     * 插入到数组尾部
     * @param {*} el 
     */
    insert_to_tail(el) {
      this.add(size, el);
    }

    /**
     * 插入到数组头部
     * @param {*} el 
     */
    insert_to_head(el) {
      this.add(0, el);
    }

    /**
     * 插入到数组尾部
     * @param {number} index 
     */
    get(index) {
      if (index >= size || index < 0) {
        throw new RangeError('操作越界!');
      }

      return data[index];
    }

    /**
     * 更新设置值
     * @param {number} index 
     * @param {*} el 
     */
    set(index, el) {
      if (index >= size || index < 0) {
        throw new RangeError('操作越界!');
      }

      data[index] = el;
    }

    /**
     * 查找元素的位置索引
     * @param {*} target 
     * @return {number} 
     */
    find_index(target) {
      for (let i = 0; i < size; i++) {
        if (data[i] === target) {
          return i;
        }
      }

      return -1;
    }

    /**
     * 是否包含某个元素
     * @param {*} el 
     * @return {boolean} 
     */
    contains(el) {
      for (const item of data) {
        if (item === el) {
          return true;
        }
      }

      return false;
    }

    /**
     * 移除某个位置上的元素并返回
     * @param {number} index 
     * @return {*} 
     */
    remove(index) {
      if (index >= size || index < 0) {
        throw new RangeError('操作越界!');
      }

      const target = data[index];
      for (let i = index + 1; i < size; i++) {
        data[i - 1] = data[i];
      }
      size--;
      data[size] = void 0;

      if (size === data.length / 2) {
        resize(data.length / 2);
      }

      return target;
    }

    /**
     * 移除头部元素
     * @return {*}
     */
    remove_head() {
      return this.remove(0);
    }

    /**
     * 移除尾部元素
     * @return {*}
     */
    remove_tail() {
      return this.remove(size - 1);
    }

    /**
     * 删除特定元素
     * @param {*} el 
     * @return {boolean} 
     */
    remove_element(el) {
      const targetIndex = this.find_index(el);
      if (targetIndex > -1) {
        this.remove(targetIndex);
        return true;
      }
      return false;
    }

    /**
     * 字符串化输出
     * @return {string} 
     */
    to_string() {
      let str = `Array: ${size}(size) - ${data.length}(capacity), [${size > 0 ? data[0] : ''}`;
      for (let i = 1; i < size; i++) {
        str += (',' + data[i]);
      }
      str += ']';
      return str;
    }
  }

  return _DArray;
})();

:JS数组本身就是一个动态对象

 

标签:index,return,el,param,JS,数组,Java,data,size
From: https://www.cnblogs.com/fanqshun/p/17462116.html

相关文章

  • 在ubuntu上后台启动nodejs、使用pm2启动多个nodejs,
    前言很久以前淘到了一个非常简易的nodejs(聊天室)的源码,今天想把他放到我的ubuntu(server20.10)上。一、正文如果直接使用指令nodeapp.js,退出终端的时候会报错,可以使用pm2来实现后台运行!1.安装node.js和npmapt-getinstallnodejsapt-getinstallnpm安装好了之后可以使用whereisn......
  • JS基础语法(一)
    javascript简介javascrpit是是一种轻量级的编程语言,常用于web前端开发。另外js还可以用来写node.js类型的服务和工具,在测试web项目的时候需要了解。  变量js定义变量有3种方式:var、const、let,3者的区别:在2015年以前,使用var关键字来声明JavaScript变量。在2015后......
  • Java多线程-工具篇-BlockingQueue
    前言:   在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认......
  • 你是怎么学习 Java 技术的?
    一、Java语言Java语言不只是一门语言。Java学习不是一蹴而就就可以达成的,它是一个循序渐进,由浅入深,由表及里的过程。尤其需要注意的是不能有浅尝辄耻,不求甚解的态度。每个地方只抓一点,等于什么也没得到。每个小范畴内的学习都必须讲究系统性,完整性。二、知识的获取你是......
  • json
    //查询时间偏移select*fromcoinerwherecreated_at+interval'8hour'>'2023-01-1300:00:00'//jsonb查询attribute.Award.type='ttc'attribute->'Award'->>'type'='ttc//时间偏移去重分组sel......
  • JAVA获取上月、本月的第一天和最后一天
    1、获取【上个月】第一天和上个月最后一天/***获取上个月第一天和上个月最后一天**@throwsParseException*/publicstaticMap<String,String>getLastOneMonthDay(){SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");Map<String,String......
  • P5333 [JSOI2019]神经网络
    P5333[JSOI2019]神经网络SolutionEGF表示有标号排列。对每棵树分别算出划分成\(i\)条链的方案数,记为\(f_i\)。具体地:设\(dp[u][i][0/1/2]\)表示在\(u\)子树内拆分成\(i\)条已结束的链,\(0\):已拼完,无法再延伸\(1\):单点,可继续向上扩展\(2\):长度\(>1\)的链......
  • Java中如何动态创建接口的实现
    下面用JDK动态代理加一点简单的代码来演示这个过程:1、接口packagecom.yhouse.modules.daos;publicinterfaceIUserDao{publicStringgetUserName();}2、创建代理 packagecom.yhouse.modules.daos;importjava.lang.reflect.Proxy;/***创建代理*@authorcl......
  • java.lang.OutOfMemoryError:GC overhead limit exceeded异常
    java.lang.OutOfMemoryError异常解决方法 原因:常见的有以下几种:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;3.代码中存在死循环或循环产生过多重复的对象实体;4.使用的第三方软件中的BUG;5.启动参数内存......
  • js 获取函数的调用者
    办法严格模式arguments.callee.caller不给使用了歪路子截取newError()的报错字符串stackconstgetCall=()=>{letcallArr=newError().stack.split("\n");callArr.splice(0,3);constpattern=/at(\w+)/;callArr=callArr.map(it=>(it.match(patt......