2016-10-13 8 views
1

私は、選手の得点に基づいて2つの "偶数チーム"を作成するようにコーディングしています。"even teams"コードの反復実行が速くなる

このアルゴリズムは、プレーヤーの配列全体を実行し、それぞれのスコアを比較して最小の差を得てから、選手を2つの配列、各チームに1つずつ並べ替えます。私はコードがOKだと思いますが、私はそれを実行しようとすると、それは本当に悪いパフォーマンスを持っているので、それは開きません

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の内側を見ると何かが間違っていることを知っています。

私はそれをより速く走らせ、より良いパフォーマンスを得る方法を教えてください。

答えて

0

これを簡単に見てみると、内側のforループは疑わしく見えます。私は試しても間違っているかもしれませんが、それにはi--;が入っていて、iはループのインデックスです。そのようなことは常に起こります。

これが当てはまらない場合は、cont2==iterador[i]|cont3==iterador[i](ビット単位または論理的または||であるはずです)、ある時点で真となるかどうかはわかりませんか?たぶん前後に行くことができました。 cont2とcontr3は変更されませんが、iは少し変更することができます。

iはゼロ以下になることはありませんが、クラッシュして焼損する可能性があります(例外)。

関連する問題