Mejora de rendimiento en el código

La declaración del problema es:

En este caso, la inclusión es nula y la exclusión tiene algunos valores, por lo que debo verificar si temp está excluido, si temp está excluido, entonces no hagas nada o simplemente puedes salir del ciclo, pero supongamos que temp no está en exclusión entonces llame a algún método. Implementé la misma función a continuación sin estar seguro de si podemos mejorar esto más o no. Según me parece, podemos mejorar esto más sin usar ningún material booleano, supongo. Como las cosas en main necesitan estar en un método y se llamarán muchas veces

public static void main(String[] args) {

    String temp = "77"; // It can also be 0
    String inclusion = null;
    String exclusion = "100;77;71";
    boolean bb = false;

    if(inclusion !=null) {
        System.out.println("Site Inclusion is not null");
    } else {
        for (String exc: exclusion.split(";")) {
            if(exc.equals(temp)) {
                bb =true;
                break;
            }
        }
        if(!bb) {
            // Call some method
        }
    }
}
Respuesta 1

La implementación más eficiente que se me ocurre es algo así como

for(int i = exclusion.indexOf(temp);
    i != -1;
    i = exclusion.indexOf(temp, i + 1)) {
  // check if it's bracketed by ; or by the end of the string
  boolean goodStart = i == 0 || exclusion.charAt(i - 1) == ';';
  boolean goodEnd = i + temp.length() == exclusion.length()
    || exclusion.charAt(i + temp.length()) == ';';
  if (goodStart && goodEnd) {
    bb = true;
    break;
  }
}

que evita la sobrecarga de expresiones regulares, usa el incorporado String.indexOfy usa solo variables adicionales constantes.

Respuesta: 2
    exclusion = ";"+exclusion+";";
    temp = ";"+temp+";";

    bb = exclusion.indexOf(temp) >= 0;
    if(!bb) {
        // Call some method
    }

las primeras dos líneas solo son necesarias si no tiene control del formato de exclusión y temperatura que se pasa. Una prueba rápida con muchas iteraciones del código en su pregunta tomó 1.74 segundos, y la misma prueba con el código anterior tomó 0.38 segundos si exclusión y temp tienen el punto y coma al inicio y al final concatenado con cada iteración del ciclo de tiempo. Si ya tienen los puntos y comas iniciales y finales, el tiempo se reduce a .07 segundos. A modo de comparación, las coincidencias (expresiones regulares) toman 1.18 segundos, y la solución StringTokenizer toma 0.50 segundos.

Respuesta: 3
bExists = Arrays.asList(exclusion.split(";")).contains(temp)
Respuesta: 4

Buscar una cadena por cualquier medio es O (N). Buscando a HashSetes O (1).

Utilizar una HashSet.

Respuesta: 5

A veces me gustaría pasar un objeto inmutable a un método y cambiar su valor dentro del método o me gustaría asignar otro objeto a la referencia del parámetro (ejemplo 1). O lo haría ...

Estoy creando un juego simple con Java Swing. Tengo un problema: el KeyListener parece reaccionar un poco entrecortado / lento. El personaje se mueve usando este código: // control de jugador clave pública vacía Presionado (...

Tengo una colección de archivos jar con dependencias en un patrón de diamante: base.jar & ...

Estoy usando seam para intentar hacer una aplicación web y estoy tratando de hacer un cuadro desplegable que muestre los vehículos que están almacenados en una base de datos y le permite al usuario seleccionar varios. Todo funciona ...