Tengo una lista que se supone que recibe valores de varios hosts periódicamente y hago algunas operaciones con estos valores.

List<Integer> loadList = new ArrayList<>(3);
if ((dstIp.toString().equals("10.0.0.1")
                        && udp.getPayload() != null) {

                    loadList.add(0, intLoad1);
                }
                else if ((dstIp.toString().equals("10.0.0.2") 
                        && udp.getPayload() != null) {

                    loadList.add(1, intLoad2);
                }
                else if ((dstIp.toString().equals("10.0.0.3") 
                        && udp.getPayload() != null) {

                    loadList.add(2, intLoad3);
                }

                if (!loadList.isEmpty() && !loadList.contains(null)) {
                    int sum = loadList.stream().mapToInt(Integer::intValue).sum();
                    System.out.println("---- Sum: "+sum);
                    double averageLoad = ((double) sum) / loadList.size();
                }

En mi código, la cuarta condición if (quiero decir if (!loadList.isEmpty() && !loadList.contains(null))) se ejecutará cada vez que reciba un nuevo valor, pero estoy tratando de cambiarlo para que se ejecute después del final de cada período ( cuando se actualizan los tres elementos de la lista). Quiero decir que quiero que se ejecute solo cuando se reciben los tres valores de carga (para que encuentre el valor promedio de los valores recién recibidos).

Busqué una solución pero no encontré nada. ¿Es posible?

2
helen 19 nov. 2018 a las 22:50

3 respuestas

La mejor respuesta

Puede agregar tres campos booleanos y usarlos en la última instrucción if:

boolean first = false;
boolean second= false;
boolean third = false;
List<Integer> loadList = new ArrayList<>(3);
if ((dstIp.toString().equals("10.0.0.1") && udp.getPayload() != null) {
    loadList.add(0, intLoad1);
    first = true;
} else if ((dstIp.toString().equals("10.0.0.2") && udp.getPayload() != null) {
    loadList.add(1, intLoad2);
    second = true;
} else if ((dstIp.toString().equals("10.0.0.3") && udp.getPayload() != null) {
    loadList.add(2, intLoad3);
    third = true;
}

if (!loadList.isEmpty() && !loadList.contains(null) && first && second && third) {
    int sum = loadList.stream().mapToInt(Integer::intValue).sum();
    System.out.println("---- Sum: "+sum);
    double averageLoad = ((double) sum) / loadList.size();
    first = false;
    second= false;
    third = false;
}
2
Centos 19 nov. 2018 a las 20:06

Usando banderas:

List<Integer> loadList = new ArrayList<>(3);
boolean first = false;
boolean second = false;
boolean third = false;

if ((dstIp.toString().equals("10.0.0.1")
        && udp.getPayload() != null) {

    loadList.add(0, intLoad1);
    first = true;
}
else if ((dstIp.toString().equals("10.0.0.2")
        && udp.getPayload() != null) {

    loadList.add(1, intLoad2);
    second = true;
}
else if ((dstIp.toString().equals("10.0.0.3")
        && udp.getPayload() != null) {

    loadList.add(2, intLoad3);
    third = true;
}

if (!loadList.isEmpty() && !loadList.contains(null) && first && second && third) {
    int sum = loadList.stream().mapToInt(Integer::intValue).sum();
    System.out.println("---- Sum: "+sum);
    double averageLoad = ((double) sum) / loadList.size();
    first = false;
    second = false;
    third = false;
}

}

0
Andrea Calin 19 nov. 2018 a las 20:12

Puede usar List<Future> e insertar los tres valores en esa lista. Luego espere a que todos estén completos y haga el promedio.

Eso se vería más o menos como a continuación:

List<Future<Integer>> futures= new ArrayList<>();
futures.push(1); // 2,3 as well
// now that we have all the future values
for(Future currFuture:futures) {
    if(!currFuture.isDone()) currFuture.get();
}
// now perform average
int sum = 0;
for(Integer value: futures) {
  sum+= value;
}
System.out.println("avg is ", sum/values.length);

La sintaxis podría salir un poco mal ya que no he escrito ningún código Java en los últimos tiempos. Por favor, siéntase libre de editar según sea necesario

0
venkatesh kl 19 nov. 2018 a las 22:49