`
macken
  • 浏览: 346805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Commons ArrayUtils 学习

    博客分类:
  • Java
 
阅读更多

1.toMap实现

 

public static Map<Object, Object> toMap(Object[] array) {
        if (array == null) {
            return null;
        }
        //GOOD:提前预估Map的尺寸,减少内存的申请
        final Map<Object, Object> map = new HashMap<Object, Object>((int) (array.length * 1.5));
        for (int i = 0; i < array.length; i++) {
            Object object = array[i];
            if (object instanceof Map.Entry<?, ?>) {
                Map.Entry<?,?> entry = (Map.Entry<?,?>) object;
                map.put(entry.getKey(), entry.getValue());
            } else if (object instanceof Object[]) {
                Object[] entry = (Object[]) object;
                if (entry.length < 2) {
                    throw new IllegalArgumentException("Array element " + i + ", '"
                        + object
                        + "', has a length less than 2");
                }
                map.put(entry[0], entry[1]);
            } else {
                throw new IllegalArgumentException("Array element " + i + ", '"
                        + object
                        + "', is neither of type Map.Entry nor an Array");
            }
        }
        return map;
    }
 

亮点:预估Map尺寸,减少了内存操作;

 

2.removeAll实现

 

 

    /**
     * Removes multiple array elements specified by index.
     * @param array source
     * @param indices to remove, WILL BE SORTED--so only clones of user-owned arrays!
     * @return new array of same type minus elements specified by unique values of {@code indices}
     * @since 3.0.1
     *GOOD:int... indices 可变参数,最终是一个数组形式在函数中出现 删除元素时,需要倒序删除元素 否则会造成删除index值不对应元素值;
     *TOKNOW:经典算法 需要研究一下
     */
    private static Object removeAll(Object array, int... indices) {
        int length = getLength(array);
        int diff = 0;
        
        //查找索引值中不重复索引值的个数
        if (isNotEmpty(indices)) {
            Arrays.sort(indices);

            int i = indices.length;
            int prevIndex = length;
            while (--i >= 0) {
                int index = indices[i];
                if (index < 0 || index >= length) {
                    throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
                }
                if (index >= prevIndex) {
                    continue;
                }
                diff++;
                prevIndex = index;
            }
        }
        Object result = Array.newInstance(array.getClass().getComponentType(), length - diff);
        //倒序操作  除去删除元素以外 分段复制到result中
        if (diff < length) {
            int end = length;
            int dest = length - diff;
            for (int i = indices.length - 1; i >= 0; i--) {
                int index = indices[i];
                if (end - index > 1) {
                    int cp = end - index - 1;
                    dest -= cp;
                    System.arraycopy(array, index + 1, result, dest, cp);
                }
                end = index;
            }
            if (end > 0) {
                System.arraycopy(array, 0, result, 0, end);
            }
        }
//	  for循环实现        
//        int index=indices.length-1;
//        for(int j=length-diff-1,i=length-1;i>=0;i--){
//        	if(i==indices[index]){
//        		Arrays.set(result,j--,array[i]);
//        		index--;
//        	}else if(i<indices[index]){
//        		index--;
//        	}else{
//        		Arrays.set(result,j--,array[i]);
//        	}
//        }
        return result;
    }
 

 

亮点:

0.先对索引值进行排序,查找不重复索引值的个数;

1.使用System.arraycopy进行数据分段复制,而不是使用for循环操作,大部分情况下效率比for循环高 (http://suddenlychen.iteye.com/blog/835423

 

2.使用倒序删除元素;

 

 

 

 

分享到:
评论

相关推荐

    org.apache.commons.lang包

    - **ArrayUtils**:处理数组的各种操作,如添加、删除、复制、转换等。 - **ClassUtils**:帮助处理类和对象相关的任务,如获取类名、比较类等。 - **DateUtils**:提供日期和时间的处理函数,包括格式化、解析、...

    Jakarta Commons CookBook学习笔记

    ### Jakarta Commons CookBook 学习笔记 #### 一、Commons Lang: EqualsBuilder and HashCodeBuilder **1.1 概述** `EqualsBuilder` 和 `HashCodeBuilder` 是 Apache Commons Lang 包中提供的两个工具类,用于...

    commons-lang-2.4.rar代码及jar文件

    源代码对于学习、调试、扩展或定制库的功能至关重要。通过阅读源代码,开发者可以了解每个类和方法的具体实现,以便更好地理解其工作原理,并可能根据需求进行修改或扩展。 Apache Commons Lang 2.4版是该库的一个...

    commons-lang-2.6jar包

    "commons-lang-2.6-sources.jar"则包含了源代码,方便开发者查看和学习实现细节。 "commons-license.txt"文件通常包含项目的授权信息,Apache Commons Lang遵循Apache License Version 2.0,这是一个非常宽松的开源...

    Apache Commons工具集

    Apache Commons是Java开发中不可或缺的一部分,它提供了一系列实用的工具类和组件,极大地丰富了Java标准库的功能。...因此,深入学习和理解Apache Commons工具集是每个Java开发者必备的技能之一。

    apache-commons源代码、api、jar包

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目...总之,这个压缩包是Java开发者学习和使用Apache Commons的理想资源,无论你是初学者还是经验丰富的开发者,都能从中受益,提升自己的编程技能和项目效率。

    jakarta commons cookbook.zip

    StringUtils提供了丰富的字符串操作方法,ArrayUtils则提供了对数组的各种操作,而DateUtils则帮助开发者更方便地处理日期和时间。 3. Jakarta Commons BeanUtils:这个模块提供了解析Java Bean的工具,使得对象...

    Apache commons jar包常用类讲解--Jakarta Commons 学习.pdf

    - **ArrayUtils**:提供了一系列针对数组的操作方法,如数组复制、填充、排序等。 - **StringUtils**:提供了丰富的字符串操作方法,如空白字符检测、字符串替换、字符串反转等。 - **BitField**:用于位字段的操作...

    commons-lang-2.6

    通过查看源代码,可以学习到如何设计和实现高效且易于维护的工具类,也可以根据需要自定义或扩展功能。 以下是一些Apache Commons Lang 2.6中的核心知识点: 1. **StringUtils**: 这个类提供了大量的字符串操作...

    Jakarta Commons组件之Lang

    Jakarta Commons是Apache软件基金会...通过学习和使用Jakarta Commons Lang,开发者可以显著提高代码的效率和可读性,避免重复编写常见的基础工具代码。同时,源码和API文档能够帮助我们更好地理解和利用这个强大的库。

    commons-lang3-3.4-src commons lang 3.3.4 src 源码

    这个“commons-lang3-3.4-src”是Apache Commons Lang库的3.4版本的源代码,对于学习和理解这个库的内部工作原理以及如何在自己的项目中高效地使用它,是非常宝贵的资源。 Apache Commons Lang 包含了大量用于日常...

    commons-lang3-3.3.2.rar

    在这个压缩包"commons-lang3-3.3.2.rar"中,我们主要关注的是版本号为3.3.2的Lang子项目,它包含了丰富的源代码供开发者学习和使用。通过深入理解这些源码,我们可以更好地掌握Java编程中的高级特性和最佳实践。 ...

    commons-lang3-3.5源码1

    通过深入学习和理解Apache Commons Lang 3.5的源码,开发者可以学习到优秀的编程实践,提升代码质量和效率。源码阅读不仅有助于理解这些工具类的内部工作原理,也有助于我们借鉴和应用到自己的项目中,提升代码的可...

    commons-lang3-3.9-tar-压缩包.zip

    Apache Commons Lang是Apache软件基金会开发的一个Java类库,它提供了许多在Java标准库中未包含的实用工具类。"commons-lang3-3.9-tar...因此,Apache Commons Lang3是Java开发者的必备工具之一,值得深入学习和掌握。

    commons+lang(API)

    Apache Commons Lang API 提供的PDF文档是学习和理解这个库的重要资源。阅读文档,了解每个类和方法的详细说明,可以帮助你更好地利用这些工具类。 总结来说,Apache Commons Lang API 是Java开发者的得力助手,它...

    commons-lang3-3.5-src

    2. `commons-lang3-3.5-src.zip`:如前所述,这是源代码包,适合那些希望查看或修改源代码的开发者,或者想要进行深度学习和定制的用户。 Apache Commons Lang 3.5 包含的关键组件和功能有: 1. **字符串工具**:...

    commons-lang3-3.10.rar

    而"commons-lang3-3.10-src.tar.gz"和"commons-lang3-3.10-src.zip"则是源码包,供开发者阅读源码、学习和自定义修改。 总之,Apache Commons Lang 3.10为Java开发者提供了大量实用的工具类,极大地简化了常见的...

    commons-lang3-3.3.1.rar

    3. **数组操作**:`ArrayUtils` 提供了数组的基本操作,如添加、删除、复制、转换等。同时,`ObjectUtils` 可以帮助处理null值的问题,避免空指针异常。 4. **数学运算**:`NumberUtils` 提供了一些实用的数字操作...

Global site tag (gtag.js) - Google Analytics