Итерация выполняется быстрее для кода «четных команд»

#java #android #performance #for-loop #iteration

#java #Android #Производительность #для цикла #итерация

Вопрос:

Я программирую для создания двух «четных команд» на основе результатов игроков (puntajes).

Алгоритм проходит через массив игроков и сравнивает счет каждого из них, чтобы получить минимальную разницу, а затем сортирует игроков в два массива, по одному для каждой команды.

Вот мой код:

 if (listaDeJugadores.size() == 6) 
//In this case I'm looking for a 6 player array, to create 3 vs 3 teams, but I'm looking to do until 22 (11 vs 11). Any ideas are welcomed.
{
        int dif1 = Math.abs((listaDeJugadores.get(0).getPuntaje()   listaDeJugadores.get(1).getPuntaje()   listaDeJugadores.get(2).getPuntaje())
                - (listaDeJugadores.get(3).getPuntaje()   listaDeJugadores.get(4).getPuntaje()   listaDeJugadores.get(5).getPuntaje()));
        int jugador1 = 0;
        int jugador2 = 1;
        int jugador3 = 2;
        int jugador4 = 3;
        int jugador5 = 4;
        int jugador6 = 5;
        int a = 0;
        int b = 0;
        int c = 0;

//The two fors are to search the arrays. The iterador is to find the other three remaining positions to compare.
            for (int cont2 = 1; cont2 < listaDeJugadores.size() - 1; cont2  ) {
                for (int cont3 = cont2   1; cont3 < listaDeJugadores.size(); cont3  ) {
                    ArrayList<Integer> arr = new ArrayList<>();
                    int iterador[] = {0,1,2,3,4,5,6};
                    int j = 1;
                    for (int i=0;i<iterador.length;i  )
                    {
                        //I look for the missing players to compare from the 6 possible
                        if (cont2==iterador[i]|cont3==iterador[i])
                        {
                            j  ;
                        }
                        else
                        {
                            c=b;
                            b=a;
                            a=j;
                            i--;
                            j  ;
                        }
                    }

                    int dif = Math.abs((listaDeJugadores.get(0).getPuntaje()   listaDeJugadores.get(cont2).getPuntaje()   listaDeJugadores.get(cont3).getPuntaje())
                            - (listaDeJugadores.get(a).getPuntaje()   listaDeJugadores.get(b).getPuntaje()   listaDeJugadores.get(c).getPuntaje()));
                    if (dif < dif1) {
                        dif = dif1;
                        jugador1 = 0;
                        jugador2 = cont2;
                        jugador3 = cont3;
                        jugador4 = a;
                        jugador5 = b;
                        jugador6 = c;
                    }
                }
        }
        //I add the best available sorted teams to EquipoBlanco or EquipoNegro.
        listaEquipoBlanco.add(listaDeJugadores.get(jugador1));
        listaEquipoBlanco.add(listaDeJugadores.get(jugador2));
        listaEquipoBlanco.add(listaDeJugadores.get(jugador3));
        listaEquipoNegro.add(listaDeJugadores.get(jugador4));
        listaEquipoNegro.add(listaDeJugadores.get(jugador5));
        listaEquipoNegro.add(listaDeJugadores.get(jugador6));

        team1.setText("Equipo Blanco: "   (listaEquipoBlanco.get(0).getPuntaje()   listaEquipoBlanco.get(1).getPuntaje()   listaEquipoBlanco.get(2).getPuntaje()));
        team2.setText("Equipo Negro: "   (listaEquipoNegro.get(0).getPuntaje()   listaEquipoNegro.get(1).getPuntaje()   listaEquipoNegro.get(2).getPuntaje()));
  

Я думаю, что код в порядке, но когда я пытаюсь его запустить, он не открывается, потому что у него действительно плохая производительность. Я думаю, что, возможно, я повторил до бесконечности или что-то подобное, но также, когда я смотрю на это и вижу fors внутри fors внутри fors, я знаю, что что-то не так.

Как я могу заставить его работать быстрее и иметь лучшую производительность?

Ответ №1:

Быстрый взгляд на это, и этот внутренний цикл for выглядит подозрительно. Возможно, я ошибаюсь, не пытаясь (плохой я), но там есть a i--; и i это индекс цикла, так что это происходит постоянно или достаточно часто, и вы никогда не выйдете из этого.

Это происходит, когда это неверно: cont2==iterador[i]|cont3==iterador[i] (побитовое или, вероятно, должно быть логичным или || , кстати), не уверен, что это гарантированно будет правдой в какой-то момент? Возможно, даже вперед и назад. cont2 и contr3 не меняются, но i могут немного измениться.

Нет защиты для i опускания ниже нуля, хотя либо это может привести к сбою и записи (исключение).