2017-04-06 7 views
1

私は今後のフィファトーナメントを開催しており、可能なマッチアップをプリントアウトするプログラムを作成しました。問題はそれが論理的にソートされていないということです。つまり、いくつかのプレイヤーは5-6の連続ゲームをしなければならず、他のゲームは6つのゲームを待たなければなりません。次の結果を得たいと思います。論理的にソートされたトーナメントフィギュア

player 1 - player 2 
player 3 - player 4 
player 5 - player 6 
player 1 - player 3 
player 2 - player 4 

などです。これは私が現時点で持っているものです。

public class Fifa { 

public static void main(String[] args) { 
    String[] players= {"Jens", "Dane", "Keppens", "Roel", "John", "Onslo", "JonasDB", "Bellon", "Sander"}; 
    String[] players2 = {"Jens", "Dane", "Keppens", "Roel", "John", "Onslo", "JonasDB", "Bellon", "Sander"}; 


    Multimap<String, String> fixtures = LinkedHashMultimap.create(); 

    for(int i = 0; i < players.length; i++){ 
     for (int j = 0; j < players.length; j++){ 
      if(!players[i].equals(players2[j])) { 
       if(!fixtures.containsKey(players2[j])) 
       fixtures.put(players[i], players2[j]); 
      } 
     } 
    } 

    for(Map.Entry map : fixtures.entries()){ 
     String key = map.getKey().toString(); 
     Object value = map.getValue(); 
     System.out.println(key + " - " + value); 
    } 

しかし、ここでは、これはプリントアウトするものである:

Jens - Dane 
Jens - Keppens 
Jens - Roel 
Jens - John 
Jens - Onslo 
Jens - JonasDB 
Jens - Bellon 
Jens - Sander 
Dane - Keppens 
Dane - Roel 
Dane - John 
Dane - Onslo 
Dane - JonasDB 
Dane - Bellon 
Dane - Sander 
Keppens - Roel 
Keppens - John 
Keppens - Onslo 
Keppens - JonasDB 
Keppens - Bellon 
Keppens - Sander 
Roel - John 
Roel - Onslo 
Roel - JonasDB 
Roel - Bellon 
Roel - Sander 
John - Onslo 
John - JonasDB 
John - Bellon 
John - Sander 
Onslo - JonasDB 
Onslo - Bellon 
Onslo - Sander 
JonasDB - Bellon 
JonasDB - Sander 
Bellon - Sander 

私が同じ値を持つ複数のキーを必要とするので、私はMultimapはを使用していました。等次いで

幾分単純なアプローチは、距離でループになり
+0

あなたの例では、お互いに対して2と3のプレイをしたときに?彼らは? 1-2,2-3,3-4,4-5,5-6,1-3,2-4などもうまくいくのでしょうか?これは、索引の代わりに遠距離をループすることで、実際に簡単に実行できるためです。 – Dukeling

+0

彼らは最終的にお互いにプレイするでしょう。そのソートロジックの「問題」は、連続したゲームをプレイするプレイヤーが常に存在するということですが、それは私の実装より優れています。これをどのように実装しますか? – Audiosleef

答えて

2

ので、我々第一出力距離1のすべてのマッチアップ、2、3、

本の基本的なバージョン:

for(int dist = 1; dist < players.length; dist++) 
for(int i = 0; i + dist < players.length; i++) 
    System.out.println(players[i] + " - " + players[i+dist]); 

これは、次の順序でマッチアップを与えるだろう:(簡潔にするために、距離によってグループ化)

0 - 1, 1 - 2, 2 - 3, 3 - 4, 4 - 5, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 
0 - 4, 1 - 5, 2 - 6, 
0 - 5, 1 - 6, 
0 - 6, 

あなたは誰もが行に2つのゲームを果たしている最初の行にシナリオを回避したい場合は、あなたはそれを分離し、奇数と偶数でそれを分割することができます:

この順でマッチアップを提供します
for(int i = 0; i < players.length-1; i+=2) 
    System.out.println(players[i] + " - " + players[i+1]); 
for(int i = 1; i < players.length-1; i+=2) 
    System.out.println(players[i] + " - " + players[i+1]); 

for(int dist = 2; dist < players.length; dist++) 
for(int i = 0; i + dist < players.length; i++) 
    System.out.println(players[i] + " - " + players[i+dist]); 

0 - 1, 2 - 3, 4 - 5, 
1 - 2, 3 - 4, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 
0 - 4, 1 - 5, 2 - 6, 
0 - 5, 1 - 6, 
0 - 6, 

この上の変化はラップアラウンドされるだろうと半分だけをループ距離(偶数サイズの配列ではdistance = length/2行の複製をマッチアップすることを避ける特別なケースを伴う)。

for(int i = 0; i < players.length; i+=2) 
    System.out.println(players[i] + " - " + players[(i+1)%players.length]); 
for(int i = 1; i < players.length; i+=2) 
    System.out.println(players[i] + " - " + players[(i+1)%players.length]); 

for(int dist = 2; dist < (players.length+1)/2; dist++) 
for(int i = 0; i < players.length; i++) 
    System.out.println(players[i] + " - " + players[(i+dist)%players.length]); 

if (players.length % 2 == 0) 
    for(int i = 0; i < players.length/2; i++) 
     System.out.println(players[i] + " - " + players[i+players.length/2]); 

マッチアップは次のようになります。

0 - 1, 2 - 3, 4 - 5, 6 - 0, 
1 - 2, 3 - 4, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 5 - 0, 6 - 1, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 4 - 0, 5 - 1, 6 - 2, 
+0

それはまさに私が欲しかったことです、ありがとう! 1つの文字列配列だけで可能だったことを知っておいて、結局ハッシュマップは必要ありませんでした!私はあなたをアップアップしますが、私の評判は低すぎます。 – Audiosleef

関連する問題