Java 如何随机化然后拆分ArrayList<;字符串>;分成两个偶数数组

Java 如何随机化然后拆分ArrayList<;字符串>;分成两个偶数数组,java,random,arraylist,split,Java,Random,Arraylist,Split,我几乎不懂java,但我正在努力为这个项目学习一些。我正在尝试修改一个名为GyaPickupBot的程序,它基本上是IRC上的一个“拾取游戏”机器人,玩家可以在其中键入:!添加,以便添加到想要玩游戏的玩家列表中,并且有足够的玩家!添加bot宣布游戏将在其上玩的游戏服务器(即quake服务器)的ip。现在,当指定的玩家数量!添加和游戏启动时,机器人只列出以前访问过的玩家!在达到最大玩家数之前添加。我想让它来划分所有的球员谁拥有!加起来分成两个大小相等的随机小组。我已经使用Collections.s

我几乎不懂java,但我正在努力为这个项目学习一些。我正在尝试修改一个名为GyaPickupBot的程序,它基本上是IRC上的一个“拾取游戏”机器人,玩家可以在其中键入:!添加,以便添加到想要玩游戏的玩家列表中,并且有足够的玩家!添加bot宣布游戏将在其上玩的游戏服务器(即quake服务器)的ip。现在,当指定的玩家数量!添加和游戏启动时,机器人只列出以前访问过的玩家!在达到最大玩家数之前添加。我想让它来划分所有的球员谁拥有!加起来分成两个大小相等的随机小组。我已经使用Collections.shuffle完成了随机部分,但我不知道如何将玩家分成两个大小相等的团队。几周前,我给作者发了一封电子邮件,他在今天早上终于回复了我一些非常模糊的提示:

嗯。。。现在,我没有太多的动力来维护这段代码。 我只能给你一些提示

private boolean handleReady(String channel, String sender, String login, String hostname, String message) {
boolean isUpdate = false;
String readyGameID = mgr.getReadyGameID();
if (null != readyGameID) {
// *** add some code here to choose teams and store that result to string variable. something like: "team1: ,,,, team2: ,,,,,"
// *** you can get players list by mgr.getPlayers(readyGameID) in order to divide players to 2 teams randomly 

for (String ch : getChannels()) {
sendMessage(ch, mgr.getPickupReadyString(readyGameID));
// sendNotice(ch, mgr.getPickupReadyString(readyGameID));
// *** then, send that string to channel
}
mgr.setLastGame(Calendar.getInstance().getTimeInMillis(), mgr.getPickupReadyString(readyGameID));
ArrayList<String> players = mgr.getPlayers(readyGameID);
for (String nick : players) {
sendNotice(nick, mgr.getPickupReadyPMString(readyGameID));
// *** and send that string to players too
}
isUpdate = mgr.clearPlayers(players);
}
return isUpdate;
private boolean handleReady(字符串通道、字符串发送器、字符串登录、字符串主机名、字符串消息){
布尔值isUpdate=false;
字符串readyGameID=mgr.getReadyGameID();
if(null!=readyGameID){
//***在此处添加一些代码以选择团队并将结果存储到字符串变量。类似于:“团队1:,,,,,,,,,,,,,”
//***您可以通过经理getPlayers(readyGameID)获取球员列表,以便将球员随机分成两支球队
for(字符串ch:getChannels()){
sendMessage(ch,经理getPickupReadyString(readyGameID));
//sendNotice(总经理,getPickupReadyString(readyGameID));
//***然后,将该字符串发送到频道
}
mgr.setLastGame(Calendar.getInstance().getTimeInMillis(),mgr.getPickupReadyString(readyGameID));
ArrayList players=mgr.getPlayers(readyGameID);
对于(字符串尼克:玩家){
sendNotice(nick,经理getPickupReadyPMString(readyGameID));
//***并将该字符串发送给玩家
}
isUpdate=mgr.clearPlayers(玩家);
}
返回isUpdate;

我知道这可能比这里要问的要多,但我真的很想了解这一点,但我想不出答案,如果有任何帮助,我们将不胜感激。

下面的代码未经测试,但应该会让您了解如何继续。祝您好运

// retrieve all players
ArrayList<String> players = mgr.getPlayers(readyGameID);
// randomize the list
Collections.shuffle(players);
// instantiate two arraylists for the teams
ArrayList<String> teamRed = new ArrayList<String>();
ArrayList<String> teamBlue = new ArrayList<String>();

// add the first half of players to teamRed
teamRed.addAll(players.subList(0, players.size() / 2 + players.size()%2));
// and the second half to teamBlue
teamBlue.addAll(players.subList(players.size() / 2 + players.size()%2, players.size()));

// now do whatever you need to do with the two teams
//检索所有玩家
ArrayList players=mgr.getPlayers(readyGameID);
//将列表随机化
收集。洗牌(玩家);
//为团队实例化两个ArrayList
ArrayList teamRed=新建ArrayList();
ArrayList teamBlue=新的ArrayList();
//将上半场球员添加到teamRed
teamRed.addAll(players.subList(0,players.size()/2+players.size()%2));
//下半场是蓝队
teamBlue.addAll(players.subList(players.size()/2+players.size()%2,players.size());
//现在对这两支球队做你需要做的一切

@RMT,不需要添加注释来指出这一点。编辑按钮为那些可以批准它的人显示待定编辑。加上mods可以看到待定编辑的总列表。非常感谢。在修改了其余代码后,我现在让这个程序完全按照我希望的方式工作。再次感谢,很高兴它有帮助。我将编辑问题标题为了更好地反映已经询问(可能已经回答)的内容以及其他人提出的关于如何“平均”拆分ArrayList的更好想法,我简化了您的建议(因为对于奇数大小,
size/2==(size-1)/2
),并将参数更正为sublist(因为第二个参数是排他性的)@Michael Brewer Davis关于简化的可能性你是正确的,但是你的编辑(还有我的代码)未返回正确的结果。正如您所述,由于第二个参数是独占的,因此我们需要将1添加到fromIndex,而不是从toindex中减去1。否则,5名参与者的列表将导致1名参与者在teamRed中,2名参与者在teamBlue中。感谢您指出java将int参数舍入到subList()。我用代码更新了我的答案,该代码将正确地生成团队红3名成员和团队蓝2名成员。测试正常。@直到--doh关于
size
参数,只是没有考虑它。对于
size/2
,您不应该添加1。(否则size=4给出(0,3)和(3,4),这意味着3和1的团队。)