0

これは私の設定ファイル(Test.txt)です

CommandA   75%
CommandB   15%
CommandC   10%

ファイルを 1 行ずつ読み取るマルチスレッド プログラムを作成しましたが、ランダム呼び出しのこの割合 (75%) が CommandA に送られる上記の質問をどのように行うべきかわかりません。ランダム呼び出しは CommandB に送られ、CommandC と同じです。

public static void main(String[] args) {

            for (int i = 1; i <= threadSize; i++) {
                new Thread(new ThreadTask(i)).start();
            }
        }

class ThreadTask implements Runnable {

        public synchronized void run() {
            BufferedReader br = null;

            try {
                String line;

                br = new BufferedReader(new FileReader("C:\\Test.txt"));

                while ((line = br.readLine()) != null) {
                    String[] s = line.split("\\s+");
                    for (String split : s) {
                    System.out.println(split);
                }
            }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (br != null)br.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

        }
    }
4

1 に答える 1

3

1 ~ 100 の乱数を取得します。数字が1~75ならコマンドA、76~90ならコマンドB、91~100ならコマンドC。

コメントのために編集:

これを行うには、2 つの方法を検討します。3 つのコマンド (A、B、C) しかない場合は、簡単に実行できます。

    int[] commandPercentages = {75, 15, 10};        
    int randomNumber = 90;

    if((randomNumber -= commandPercentages[0]) < 0) {
        //Execute Command A
    }
    else if((randomNumber -= commandPercentages[1]) < 0) {
        //Execute Command B
    }
    else {
        //Execute Command C
    }

複雑なコマンドがたくさんある場合は、次のようにコマンドを設定できます。

private abstract class Command {
    int m_percentage;       
    Command(int percentage) {
        m_percentage = percentage;
    }       
    int getPercentage() {
        return m_percentage;
    }
    abstract void executeCommand();
};

private class CommandA extends Command {        
    CommandA(int percentage) {
        super(percentage);
    }
    @Override
    public void executeCommand() {
        //Execute Command A
    }       
}

private class CommandB extends Command {        
    CommandB(int percentage) {
        super(percentage);
    }
    @Override
    public void executeCommand() {
        //Execute Command B
    }

}

次に、次のようにコマンドを選択します。

    Command[] commands = null;  
    int randomNumber = 90;

    commands[0] = new CommandA(75);
    commands[1] = new CommandB(25);

    for(Command c: commands) {
        randomNumber -= c.getPercentage();
        if(randomNumber < 0) {
            c.executeCommand();
        }
    }
于 2012-05-15T19:43:34.490 に答える