Aprender a leer el código fuente del programa - un bucle sin fin Mágico

Ahora supongamos que tiene una matriz de enteros:

Entero [] = {20 es ARR, 20 se ,. 4 ,. 4, 21 es ,. 7}; // 2020 años de fecha 4 de 5. 4. 7 Día 21 es cuándo.

Cómo espacios con una coma "" dividir los elementos de la matriz y se coloca en el '[]' elemento de la matriz con el fin de obtener el siguiente formato de cadena que?

  [20, 20, 4, 4, 21, 7]

te mostrará el código que he escrito:

public static cadena toString (Object [] arr) {
     si (arr == nula ) {
          retorno "nulo" ; 
    } 
    Resultado StringBuilder = nuevo StringBuilder ( "[" );
    para ( int i = 0; i <arr.Length; i ++ ) { 
        result.append (arr [i]); 
        si (i <arr.Length - 1 ) { 
            result.append ( "" ); 
        } 
    } 
    Retorno result.append ( "]" ) .toString (); 
}

Con base en las pruebas de unidad actuales:

1. La longitud de la matriz debería volver a 0 []

@Test
 pública  vacío printArray1 () { 
    Object [] arr = {}; 
    Assert.assertEquals ( "[]" , toString (arr)); 
}

2. Los elementos de la matriz deben ser devueltos cuando dicho conjunto de elementos de [20, 20, 4, 4, 21, 7]

@Test
 público  void printArray2 () { 
    Object [] arr = {20, 20, 4, 4, 21, 7 }; 
    Assert.assertEquals ( "[20, 20, 4, 4, 21, 7]" , toString (arr)); 
}

El método ha sido probado y no es un problema.

Las herramientas de JDK java.util.Arrays ya tienen un camino para realizar esta función, pegue el siguiente código:

pública  estática Cadena toString (Object [] a) {
     si (a == nula )
         de retorno "nulo" ; 

    int Imáx = a.length - 1 ;
    si (Imax == -1 )
         de retorno "[]" ; 

    StringBuilder b = nuevo StringBuilder (); 
    b.append ( '[' );
    para ( int i = 0;; i ++ ) { 
        b.append (String.valueOf (a [i])); 
        si (i == Imax)
             de retorno b.append ( ']' ) .ToString (); 
        b.append ( "" ); 
    } 
}

A través de la matriz se implementan por medio de elementos de empalme StringBuilder, excepto como sigue.

1. La longitud de la matriz es cuando manejo cero

JDK se determina en el caso donde la longitud de la matriz es cero, entonces un retorno directo "[]"; no trato con esta situación particular, pero 0 cuando el bucle no se ejecuta para cuando controlada indirectamente por la longitud de la matriz, este enfoque un mal lugar para ser cuando la longitud de la matriz va a crear un objeto StringBuilder es 0.

2. Objeto elemento de la matriz si se quiere convertir en una cadena y luego cosiendo

I dirigir el Objeto elementos de la matriz son empalmados por un append StringBuilder (Objeto) método, pero el enfoque de JDK es a cada elemento de la matriz del objeto llama al método String.valueOf (Objeto) y luego se convierte a una costura String, los beneficios de hacerlo puede ser mejor legibilidad, pero el código ordenada perspectiva innecesario hacerlo, porque la conversión del método append interna StringBuilder (objeto) en sí se opondría parámetros de cadena:

@ Override
 pública append StringBuilder (Object obj) {
     retorno de adición (String.valueOf (obj)); 
}

Después de que el elemento de control 3 y el último bucle sin tratamiento delimitador de empalme

Convencional I i <manera controlada arr.Length a través de la matriz, y el tratamiento especial explícitamente último elemento (si (i <arr.Length - 1)) donde ningún separador de empalme; la práctica de la JDK aún más inteligente, con un bucle for es bucle infinito, volver directamente después transversal al soporte derecho cuando el último elemento de la final de la costura, como hago para evitar un juicio final en la declaración de bucle y el cuerpo del bucle, respectivamente, cuando el elemento de acción se debe ejecutar, ejecutar de manera más eficiente.

conclusión

总体来看我的实现方式很常规,JDK 的实现显然更高明。

之前一直对死循环这一单纯听名字就可能产生灾难性问题的做法敬而远之,以为非特殊情况根本不会用到,通过此次比较发现,如果循环时需要处理特殊情况并在这种特殊情况时需要终止循环,则可以直接通过这种特殊情况控制循环,而无需单独作控制,这样可以显著提高程序执行效率。

综上,将 java.util.Arrays的方法作简单优化,去掉显示转换 Object 为 String 的方法并替换为 StringBuilder 的 append(Object)方法,得到如下方法:

public static String toString(Object[] a) {
    if (a == null)
        return "null";

    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

 


 

我们的口号是:Learn from the best and be the best.

 

Supongo que te gusta

Origin www.cnblogs.com/weix-l/p/12635362.html
Recomendado
Clasificación