Java 在相同大小的存储桶中生成非重复对

Java 在相同大小的存储桶中生成非重复对,java,algorithm,Java,Algorithm,我有一个从这个代码生成的对的列表 int n = listTeam.size(); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (i != j) listTeamPairs.add(new Team[] { listTeam.get(i), listTeam.get(j) }); } } } 我面临的问题是将这些对挑选成大

我有一个从这个代码生成的对的列表

int n = listTeam.size();
for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        if (i != j)
            listTeamPairs.add(new Team[] { listTeam.get(i), listTeam.get(j) });
        }
    }
}
我面临的问题是将这些对挑选成大小相等的圆(桶)(本例中为三个)

第一轮将成为

0-1, 2-3, 4-5
问题在第二轮中出现

0-2, 1-3 <- swap order of these matches. 
This leaves only team 4-5 again. Which is not valid.
0-2,1-3 p[0].getName().contentEquals(team1.getName())|
p[1].getName().contentEquals(team2.getName())|| p[0].getName().contentEquals(team2.getName())||
p[1].getName().contentEquals(team1.getName()).findAny();
if(t.isPresent())
返回false;
roundTeams.add(teamInRound);
TMP移除(组队环绕);
返回true;
}
专用void生成器unds(列表团队){
对于(int i=0;iSystem.out.println(p[0].getName()+“-”+p[1].getName());
如果(i==0){
teams.add(tmpTeamPairs.get(0));
tmpTempairs.remove(0);
持续
}
对于(团队[]对:tmpTeamPairs){
布尔b=生成循环(成对,团队);
如果(b){
打破
}
}
}       
}
从提议的答案来看,它似乎没有生成想要的桶

scheduled team 0 against team 4
scheduled team 2 against team 3 <-----
scheduled team 5 against team 1
Array order
0
2 <---
5
4
3 <---
1
Lag 5 - Lag3
Lag1 - Lag2 <-----
Lag4 - Lag 6
-----------------------------------------------
scheduled team 0 against team 5
scheduled team 1 against team 4
scheduled team 2 against team 3 <----
Array order
0
1
2 <---
5
4
3 <---
Lag 5 - Lag4
Lag 6 - Lag3
Lag1 - Lag2 <-----
预定的0队对4队

预定的第2队对第3队你想要实现的是制定一个比赛计划,包括回合。这可以使用循环调度算法来完成

这是通过修复一个竞争对手来实现的,比如0。其余部分将顺时针旋转以生成新组合

实现这一点的代码可以如下所示:

public static void generateRoundRobinPairs(List<Integer> teams) {
    Integer fixedElement = teams.get(0);
    List<Integer> teamsWithoutFirst = teams.subList(1,teams.size());
    for (int i = 0; i < teamsWithoutFirst.size(); i++) {
        List<Integer> toSchedule = new ArrayList<>();
        toSchedule.add(fixedElement);
        teamsWithoutFirst = buildNewRotation(teamsWithoutFirst);
        toSchedule.addAll(teamsWithoutFirst);
        scheduleRound(toSchedule);
    }
}

public static void scheduleRound(List<Integer> teams) {
    for (int i = 0; i < teams.size() / 2; i++) {
        // here create your data structure
        String template ="scheduled team %s against team %s";
        System.out.println(String.format(template, teams.get(i), teams.get(i + teams.size() / 2)));
    }
}

public static List<Integer> buildNewRotation(List<Integer> l) {
    List<Integer> newList = new ArrayList<>();
    newList.add(l.get(l.size() / 2));

    for (int i = 0; i < l.size() / 2 - 1; i++) {
        newList.add(l.get(i));
    }
    for (int i = 0; i < l.size() / 2; i++) {
        newList.add(l.get(i + 1 + l.size() / 2));
    }

    newList.add(l.get(l.size() / 2 - 1));
    return newList;
}
publicstaticvoidgenerateroundrobinpairs(列表团队){
整数fixedElement=teams.get(0);
List teamsWithoutFirst=teams.subList(1,teams.size());
对于(int i=0;i
下面是循环调度的另一个实现

它返回成对存储桶的列表。虽然您可以创建一个自定义类,但pair只是通过
列表实现的

每个bucket都是一个
集合
,因为只要团队配对已知,bucket中的顺序就无关紧要

计划本身是一个
列表
,因为顺序在计划中很重要

该方法是通用的,因此您可以将其作为
Integer
String
放入团队中,以查看它是否工作正常,或者使用一个成熟的
Team

public static <T> List<Set<List<T>>> roundRobin(List<T> teams) {

    int numTeams = teams.size();

    // For a proper league, we only allow even number of teams.
    if ( numTeams % 2 != 0 ) {
        throw new IllegalArgumentException("Number of teams not even " + numTeams);
    }

    List<Set<List<T>>> result = new ArrayList<>(numTeams - 1);


    // Implement the round robin by rotating the right side of the list
    // every time, then pairing opposite teams. Note that the first
    // item is not part of the rotation.
    for ( int i = 0; i < numTeams - 1; i++ ) {
        Collections.rotate(teams.subList(1,numTeams), 1);
        Set<List<T>> bucket = new HashSet<>();
        for ( int j = 0; j < numTeams / 2; j++ ) {
            bucket.add(Arrays.asList(teams.get(j), teams.get(numTeams - j - 1)));
        }
        result.add(bucket);
    }
    return result;
}
结果:

[West Ham Utd., Liverpool] [Chelsea, Tottenham] [Manchester Utd., Arsenal] [Manchester Utd., Liverpool] [Arsenal, Tottenham] [West Ham Utd., Chelsea] [Liverpool, Chelsea] [Manchester Utd., Tottenham] [Arsenal, West Ham Utd.] [Liverpool, Arsenal] [Tottenham, West Ham Utd.] [Manchester Utd., Chelsea] [Manchester Utd., West Ham Utd.] [Tottenham, Liverpool] [Chelsea, Arsenal] 致:

Set pair=Arrays.asList(teams.get(j),teams.get(numTeams-j-1));
如果(i%2==1&&j==0){
收藏。反面(成对);
}
bucket.add(成对);

不相关,但是如果(i!=j)
似乎不需要。如果i=j,球队会自己比赛。当然,但是你已经用
来说明这一点了(int j=i+1;…
已经开始了。你是在寻找任何分为两轮的分区?还是随机的分区?@realpoint any会这样做…事实上早在你看到5-3将出现在前两轮时就打了电话:计划0队对2队计划5队对3队计划1队对4队计划0队对1队sc计划的第4队对第2队计划的第5队对第3队没有帮助发送[0,1,2,5,4,3]中的数组。
public static <T> List<Set<List<T>>> roundRobin(List<T> teams) {

    int numTeams = teams.size();

    // For a proper league, we only allow even number of teams.
    if ( numTeams % 2 != 0 ) {
        throw new IllegalArgumentException("Number of teams not even " + numTeams);
    }

    List<Set<List<T>>> result = new ArrayList<>(numTeams - 1);


    // Implement the round robin by rotating the right side of the list
    // every time, then pairing opposite teams. Note that the first
    // item is not part of the rotation.
    for ( int i = 0; i < numTeams - 1; i++ ) {
        Collections.rotate(teams.subList(1,numTeams), 1);
        Set<List<T>> bucket = new HashSet<>();
        for ( int j = 0; j < numTeams / 2; j++ ) {
            bucket.add(Arrays.asList(teams.get(j), teams.get(numTeams - j - 1)));
        }
        result.add(bucket);
    }
    return result;
}
    List<String> teams = Arrays.asList(
                             "Manchester Utd.",
                             "Chelsea",
                             "Tottenham",
                             "Liverpool",
                             "Arsenal",
                             "West Ham Utd." );

    for ( Set<List<String>> bucket : roundRobin(teams)) {
        for ( List<String> pair : bucket) {
            System.out.println(pair);
        }
        System.out.println();
    }
[West Ham Utd., Liverpool] [Chelsea, Tottenham] [Manchester Utd., Arsenal] [Manchester Utd., Liverpool] [Arsenal, Tottenham] [West Ham Utd., Chelsea] [Liverpool, Chelsea] [Manchester Utd., Tottenham] [Arsenal, West Ham Utd.] [Liverpool, Arsenal] [Tottenham, West Ham Utd.] [Manchester Utd., Chelsea] [Manchester Utd., West Ham Utd.] [Tottenham, Liverpool] [Chelsea, Arsenal]
bucket.add(Arrays.asList(teams.get(j), teams.get(numTeams - j - 1)));
Set<List<T>> pair = Arrays.asList(teams.get(j), teams.get(numTeams - j - 1));
if ( i % 2 == 1 && j == 0 ) {
    Collections.reverse(pair);
}
bucket.add(pair);