关于ArrayUtil代码的优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ArrayUtil代码的优化相关的知识,希望对你有一定的参考价值。

public int[] removeZero(int[] oldArray)
{    //传进空数组是返回空数组
        if(oldArray == null)
            return null;
        int count = 0; //统计非零元素个数
        int b[] = new int[oldArray.length];
        //先统计非零元素个数,并将非零元素存入一个和原数组同样大小的新数组
        for(int i=0; i < oldArray.length; i++)
        {
            if(oldArray[i] != 0)
            {
                b[count++] = oldArray[i];
            }    
        }
        //初始化一个元素个数为非零元素个数的新数组
        int newArray[] = new int[count]; 
        //将非零元素copy到新数组
        System.arraycopy(b, 0, newArray, 0, count);
        
        return newArray;
}

 代码存在以下几个问题:

1.首先是括号缩进 最好是符合JAVA标准

标准的 Java 括号语法:
public static void main(String[] args) {
}

因为它是标准的,所以遇到的大部分代码(比如尚未编写,但可能付费维护的代码)很可能是以这种方式编写的。Eclipse 确实 允许采用你喜欢的任何方式定义代码风格和格式化代码。但是,如果不熟悉 Java,你可能还没有形成自己的风格。

 2.对代码的边界条件进行判断

  例如数组为空或者数组为null 分别应该怎么判断

3.对if() while() for()函数体,哪怕使用一行代码,最好也加上括号,因为以后极有可能对代码进行优化重构,加上括号避免出错

if(array == null) {
    return null;
}

4.对于返回一个数组可以用Arrays.copyof()来进行优化

int newArray[] = new int[count]; 
//将非零元素copy到新数组
System.arraycopy(b, 0, newArray, 0, count);
return newArray;
//对于返回一个数组可以用Arrays.copyof()来进行优化

return Arrays.copyof(b, count);

5. 对可以局部化处理的变量最好在局部定义

int j = 0;
for(j = 0; j<a.length; j++)
{
}
//可以替换成
for(int j = 0; j<a.length; j++) {

}

6.对有具体功能的代码进行重构

for(n = 2; n < max; n++)
        {
            if( count < max)
            {    
                //判断当前n是不是素数
                int i = 2;
                while(i < n)  
                {
                    if(n % i == 0)
                        break;
                    if(n % i != 0)
                        i++;
                }
                if(i == n)
                {    //将素数统计出来
                    Array[count++] = n;
                }
            }
        }

可以将判断素数的功能拆分出来

for(int n = 2; n < max; n++)  {
    if(isPrime(n)) {
        array[count++] = n;
    }
}
//以下是素数功能拆分
private boolean isPrime(int n) {
        //判断当前n是不是素数
        int i = 2;
        while(i < n)  {
            if(n % i == 0)
                break;
            if(n % i != 0)
                i++;
        }
        return i == n;
    }

7.频繁对字符串进行操作时最好使用StringBuiler来进行处理

public String join(int[] array, String seperator)
{
        String s = null;
        if(array.length == 0)
            return "";
        s = Integer.toString(array[0]);
        if(array.length > 1)
        {
            s = s + seperator;
            for(int i=1; i<array.length-1; i++)
                s = s + array[i] + seperator;
            s = s + array[array.length -1];
        }    
        return s;
 }

可以优化成这样

StringBuilder buffer = new StringBuilder();
for(int i=0; i<array.length; i++) {
    buffer.append(array[i]);
    if(i < array.length -1) {
        buffer.append(seperator);
    }
}
     
return buffer.toString();

以上就是在老师讲解作业后对自己代码中的问题的总结

 

以上是关于关于ArrayUtil代码的优化的主要内容,如果未能解决你的问题,请参考以下文章

优化 C# 代码片段、ObservableCollection 和 AddRange

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何优化C ++代码的以下片段 - 卷中的零交叉

从JVM的角度看JAVA代码--代码优化

关于代码片段的时间复杂度

关于博客优化2.0