所以我正在为我的男女混合垒球队创建一个名单应用程序。联盟规则说,如果两个家伙连续击球,一个女孩必须跟随。这会导致问题,如果男孩女孩的比例不平衡,例如,如果有4个女孩和14个家伙,至少有一个女孩将不得不在击球顺序的同一次击球两次击球,以满足'男人的家伙女孩的规则,然后她必须被安排在女孩队列的后面,所以下一次通过第二个女孩移动到第一个女孩的位置,第三个到第二个,等等所以通过第三个或第四局我们疯狂地在收据背面涂抹修改后的击球顺序,或者在我们试图跟踪谁击球的时候。
然后,我正在创建的应用程序的目的是允许用户输入击球顺序,按下按钮,并看到击球顺序,例如,通过顺序推断四次(obv用户可以决定多少),相应地调动阵容中的女孩。
到目前为止,该应用程序允许您添加玩家,设置性别,并将其按所需顺序排列。这都在数据库中跟踪。现在我要按'按下按钮,通过订单查看x次。'我的工作是什么,假设订单是严格'男人女孩'。但它无法处理任何变化,例如最初的顺序是'男孩女孩男人'或'女孩男人'。我编码的逻辑只是忽略了它并将其改为'男人女孩'。
我可以使用什么逻辑来正确处理任何初始击球顺序?
这是我的代码:
//pos == numerical position in the roster
public void computeKickingOrder() {
String TAG = "cKO";
// instantiate dbhandler
DatabaseHandler db = new DatabaseHandler(this);
// get all tasks
List<Player> players = db.getAllPlayers();
List<Player> guys = new ArrayList<Player>();
List<Player> girls = new ArrayList<Player>();
List<Player> theRoster = new ArrayList<Player>();
int pCount = players.size();
int cycles = 4;
Log.d(TAG, "Total Players: " + pCount);
Log.d(TAG, "Generating " + cycles + " runs through the order.");
//one cycle = guycount + guycount/2
//Iterator<Player> itr = players.iterator();
Iterator<Player> itr;
// first cycle through the whole roster and separate out guys and girls
// use cycles + 5 to ensure that there are plenty of players available in each list
for (int i = 0 ; i < cycles + 5 ; i++) {
itr = players.iterator();
while(itr.hasNext()) {
Player p = itr.next();
if(p.getGender().equals("M")) { guys.add(p); }
else { girls.add(p); }
}
}
Log.d(TAG, "guys.size(): " + guys.size());
Log.d(TAG, "girls.size(): " + girls.size());
//below code automatically creates guy guy girl order IGNORES that a girl might be first or second
int girlSpot = 0;
int guyKicks = 1;
int pos = 1;
for(int i=0; i<guys.size(); i++) {
if(guyKicks<3) {
Player p = guys.get(i);
p.setPos(pos);
theRoster.add(p);
guyKicks++;
Log.d(TAG, pos + " | " + p.getGender() + " | " + p.getName());
}
else {
guyKicks = 1;
Player p = girls.get(girlSpot);
p.setPos(pos);
theRoster.add(p);
girlSpot++;
Log.d(TAG, pos + " | " + p.getGender() + " | " + p.getName());
}
pos++;
}
答案 0 :(得分:1)
您可以创建一个简单的状态机。看看起始顺序中的前两项,你知道你所处的状态。也就是说,如果你有三种状态:
state 1: guy
state 2: guy
state 3: girl
程序流从状态1进入状态2,然后是2到3,从3回到1.
现在,如果您查看开始顺序中的前两项,您就知道自己处于什么状态:
[guy, guy]: starting state 1
[guy, girl]: starting state 2
[girl, guy]: starting state 3
答案 1 :(得分:1)
保持两个队列:男人和女孩。生成没有特定名称的“旋转模板”,只有gal或gal表示。所以你说,
1: guy
2: guy
3: gal
4: guy
5: gal
6: guy
7: guy
8: gal
9: gal
或者其他什么,只要它满足了家伙-gal-gal规则。通过处理旋转模板生成初始旋转。对于每个职位,你从他们各自的队列中拉出一个人或者gal。
每当有人从队列中拉出并插入旋转时,它们就会被插回到队列中。当他们面前的男人或女孩的整个队列都筋疲力尽时,他们会再次蝙蝠。
Queue<String> guys = new LinkedList<String>();
Queue<String> gals = new LinkedList<String>();
guys.add("John");
guys.add("Jeff");
guys.add("Bill");
guys.add("Frank");
gals.add("Mary");
gals.add("Tricia");
enum Gender { GUY, GAL };
Gender[] template = new Gender[] { GUY, GUY, GAL, GUY, GUY, GAL, GUY, GAL, GAL };
String[] getRotation() {
String[] rotation = new String[9];
for (int i = 0; i < template.length; i++) {
String batter;
if (template[i] == GUY) {
batter = guys.poll();
guys.offer(batter);
} else {
batter = gals.poll();
gals.offer(batter);
}
rotation[i] = batter;
}
return rotation;
}