zoukankan      html  css  js  c++  java
  • ArrayUtils

    Arrayutils常用方法

    toString   将一个数组转换成String,用于打印数组
    isEquals   判断两个数组是否相等,采用EqualsBuilder进行判断
    toMap 将一个数组转换成Map,如果数组里是Entry则其Key与Value就是新Map的Key和Value,如果是Object[]则Object[0]为Key,Object[1]为Value
    clone 拷贝数组
    subarray 截取子数组
    isSameLength 判断两个数组长度是否相等
    getLength 获得数组的长度
    isSameType 判段两个数组的类型是否相同
    reverse 数组反转
    indexOf  查询某个Object在数组中的位置,可以指定起始搜索位置
    lastIndexOf  反向查询某个Object在数组中的位置,可以指定起始搜索位置
    contains  查询某个Object是否在数组中
    toObject  将基本数据类型转换成外包型数据
    isEmpty  判断数组是否为空(null和length=0的时候都为空)
    addAll   合并两个数组
    add 添加一个数据到数组
    remove   删除数组中某个位置上的数据
    removeElement  删除数组中某个对象(从正序开始搜索,删除第一个)

    引用包

    import java.lang.reflect.Array;//此类提供了动态创建和访问 Java 数组的方法
    import java.util.Arrays;         //此类包含用来操作数组(比如排序和搜索)的各种方法
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    
    import org.apache.commons.lang3.builder.EqualsBuilder;
    import org.apache.commons.lang3.builder.HashCodeBuilder;
    import org.apache.commons.lang3.builder.ToStringBuilder;
    import org.apache.commons.lang3.builder.ToStringStyle;
    import org.apache.commons.lang3.mutable.MutableInt;

    通过引用包可以看到ArrayUtils对Array的操作,并对Arrays进行一定的封装,并使用多个自定义的Builder进行辅助

    1.null对象

     public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
        
     public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
    
     public static final int INDEX_NOT_FOUND = -1;

    一开始有很多类似这样的对象,和一个null索引,用null对象代替null

    2.toString 打印数组

     public static String toString(Object array)
        {
            return toString(array, "{}");
        }
    
        public static String toString(Object array, String stringIfNull)
        {
            if(array == null)
                return stringIfNull;
            else
                return (new ToStringBuilder(array, ToStringStyle.SIMPLE_STYLE)).append(array).toString();
        }

    这个简单,用了个ToStringBuilder

    3.isEquals 判断数组内容是否相等

       public static boolean isEquals(Object array1, Object array2) {
            return new EqualsBuilder().append(array1, array2).isEquals();
        }
        public EqualsBuilder append(Object lhs, Object rhs) {
            if (isEquals == false) {
                return this;      
            }
            if (lhs == rhs) {
                return this;
            }
            if (lhs == null || rhs == null) {
                this.setEquals(false);//并不是isEquals = false;
                return this;
            }
            Class<?> lhsClass = lhs.getClass();
            if (!lhsClass.isArray()) {
                // The simple case, not an array, just test the element
                isEquals = lhs.equals(rhs);//判断依据
            } else if (lhs.getClass() != rhs.getClass()) {
                // Here when we compare different dimensions, for example: a boolean[][] to a boolean[]
                this.setEquals(false);
            }
            // 'Switch' on type of array, to dispatch to the correct handler
            // This handles multi dimensional arrays of the same depth
            else if (lhs instanceof long[]) {
                append((long[]) lhs, (long[]) rhs);
            } else if (lhs instanceof int[]) {
                append((int[]) lhs, (int[]) rhs);
            } else if (lhs instanceof short[]) {
                append((short[]) lhs, (short[]) rhs);
            } else if (lhs instanceof char[]) {
                append((char[]) lhs, (char[]) rhs);
            } else if (lhs instanceof byte[]) {
                append((byte[]) lhs, (byte[]) rhs);
            } else if (lhs instanceof double[]) {
                append((double[]) lhs, (double[]) rhs);
            } else if (lhs instanceof float[]) {
                append((float[]) lhs, (float[]) rhs);
            } else if (lhs instanceof boolean[]) {
                append((boolean[]) lhs, (boolean[]) rhs);
            } else {
                // Not an array of primitives
                append((Object[]) lhs, (Object[]) rhs);
            }
            return this;
        }

    注意到几点

    1通过set赋值,其他的不说,至少在有==的情况下不容易迷惑- -

    2if一行也加{},至少我很少这样做

    3面向对象,如果我来写,isEquals 应该更像一个过程

    4.toMap

     public static Map<Object, Object> toMap(Object[] array) {
            if (array == null) {
                return null;
            }
            final Map<Object, Object> map = new HashMap<Object, Object>((int) (array.length * 1.5));//看见int,第一反应是撑爆他,不过我输了
            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());//没有直接使用object
                } 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;
        }

     1final,Map.Entry 以后再说

    2最终处理的对象都是entry

    5.toArray

        public static <T> T[] toArray(final T... items) {//可变长度
            return items;
        }

    新的创建数组的方式

    6.subarray截取

       public static int[] subarray(int[] array, int startIndexInclusive, int endIndexExclusive) {
            if (array == null) {
                return null;
            }
            if (startIndexInclusive < 0) {
                startIndexInclusive = 0;
            }
            if (endIndexExclusive > array.length) {
                endIndexExclusive = array.length;
            }
            int newSize = endIndexExclusive - startIndexInclusive;
            if (newSize <= 0) {
                return EMPTY_INT_ARRAY;
            }
    
            int[] subarray = new int[newSize];
            System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
            return subarray;
        }

    截取什么的最讨厌了,索引还是长度弄不清楚的话每次都要实验,可以明显的发现startIndexInclusive和endIndexExclusive结尾单词不一样,不过我没法很好的翻译他们,直接看代码可以很清楚知道Inclusive就是索引,Exclusive是长度,即索引额外的+1

    7.reverse 反转

        public static void reverse(Object[] array) {
            if (array == null) {
                return;
            }
            int i = 0;
            int j = array.length - 1;
            Object tmp; //写在循环外
            while (j > i) {
                tmp = array[j];
                array[j] = array[i];
                array[i] = tmp;
                j--;
                i++;
            }
        }

    8.indexOf 查找

        public static int indexOf(Object[] array, Object objectToFind, int startIndex) {
            if (array == null) {
                return INDEX_NOT_FOUND;
            }
            if (startIndex < 0) {
                startIndex = 0;
            }
            if (objectToFind == null) {
                for (int i = startIndex; i < array.length; i++) {
                    if (array[i] == null) {
                        return i;
                    }
                }
            } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
                for (int i = startIndex; i < array.length; i++) {
                    if (objectToFind.equals(array[i])) {//根据equals判断
                        return i;
                    }
                }
            }
            return INDEX_NOT_FOUND;
        }

    9.contains

        public static boolean contains(Object[] array, Object objectToFind) {
            return indexOf(array, objectToFind) != INDEX_NOT_FOUND;
        }


    其他的都很简单,不在贴了,总结下心得

    Object 终究代替不了一切,特殊的类型的方法还是得c+v,null对象代替null,通过set赋值,if一行也加{},同一个方法最终处理的对象具有相同的名字,final和内部类得用用,命名还是需要专业英语(受够了拼音缩写)以及面向对象(build辅助类)

  • 相关阅读:
    Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(2)
    大话重构 之 消除巨无霸类
    Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(1)
    大话重构 之 消除过长方法
    Spark大数据处理 之 动手写WordCount
    高效法则 之 你还在用这么low的方法打开软件吗?
    大话重构 之 解决万恶之首“重复代码”
    高效法则 之 码龙们,你们还在浪费自己的生产率吗?!
    Mac版,mysql重置密码
    flask-- 基础篇
  • 原文地址:https://www.cnblogs.com/liuCy/p/3490392.html
Copyright © 2011-2022 走看看