0

そこで、共学のソフトボール チームの名簿アプリを作成しています。リーグの規則では、男子が 2 人連続で打ったら女子が従わなければならない。これは、男子女子の比率がバランスが取れていない場合に問題を引き起こします。たとえば、女子が 4 人で男子が 14 人の場合、「男子男子」を満たすために、少なくとも 1 人の女子が同じ打順で 2 回打たなければなりません。女の子のルール、そして彼女は女の子のキューの後ろに置かれなければならないので、次回は2番目の女の子が最初の女の子のスポットに移動し、3番目の女の子は2番目の女の子のスポットに移動します。 4回、レシートか何かの裏に変更された打順を必死に走り書きし、誰がいつ打ったかを追跡しようとします。

次に、私が作成しているアプリの目的は、ユーザーが打順を入力してボタンを押すと、その打順が、たとえば 4 回にわたって外挿されることを確認できるようにすることです (明らかに、ユーザーは打順を決定できます)。 )、それに応じてラインナップ内の女の子を移動します。

これまでのところ、このアプリでは、プレーヤーを追加し、性別を設定し、希望する順序に並べることができます。これはすべてデータベースで追跡されます。これで、「ボタンを押して、注文を x 回見る」ことができます。注文が厳密に「男男女」であると仮定して、私が持っているものはうまくいきます。しかし、最初の順序が 'guy girl guy guy' または 'girl guy guy' のようなバリエーションを処理することはできません。私がコード化したロジックはそれを無視して、'guy guy girl' に変更します。

最初の打順を正しく処理するには、どのようなロジックを使用できますか?

これが私のコードです:

//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++;

    }
4

2 に答える 2

1

男と女の 2 つのキューを保持します。特定の名前を付けずに、gal または gal の表示のみを使用して、「ローテーション テンプレート」を生成します。だからあなたは言った、

1: guy
2: guy
3: gal
4: guy
5: gal
6: guy
7: guy
8: gal
9: 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;
}
于 2013-03-25T20:16:13.667 に答える
1

シンプルなステート マシンを作成できます。開始順序の最初の 2 つの項目を見ると、現在の状態がわかります。つまり、3 つの状態があるとします。

state 1: guy
state 2: guy
state 3: girl

プログラム フローは、状態 1 から状態 2 へ、次に 2 から 3 へ、そして 3 から 1 へ戻ります。

ここで、開始順序の最初の 2 つの項目を見ると、開始時の状態がわかります。

[guy, guy]:  starting state 1
[guy, girl]: starting state 2
[girl, guy]: starting state 3
于 2013-03-25T19:54:33.570 に答える