对于"甚至是团队"迭代运行得更快码

时间:2016-10-13 00:25:02

标签: java android performance for-loop iteration

我正在编写创建两个"甚至团队"基于球员'得分(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我知道有些不对劲。

如何让它运行得更快,性能更好?

1 个答案:

答案 0 :(得分:0)

快速浏览它以及内部for循环看起来很可疑。我没有尝试(坏我)可能是错的,但它有一个i--;在那里,我是循环索引所以这一直发生或经常足够你永远不会退出那个。 当这不是真的时候会发生这种情况:cont2 == iterador [i] | cont3 == iterador [i](按位或者,应该是逻辑或||顺便说一句),不确定是否保证是真的在某一点?甚至可能会来回走动。 cont2和contr3没有变化,但我可以改变一点。 我没有保护我低于零虽然如此可能崩溃和燃烧(例外)。