LoginSignup
1
1

More than 1 year has passed since last update.

【JAVA】「くじで席替え+ファイル出力(CSV)」「フローチャート作成(plantuml)」

Last updated at Posted at 2021-06-30

概要

「くじで席替え+ファイル出力(CSV)」する簡単なプログラムです。
フローチャートも作成しました。

備考
人数 18人
出席番号(ID) 0-17
前の席希望者(KIBOU) n人(複数可)
くじ 18枚
くじ番号(KUJI) 0-17
席番号(希望者) 0-n
席番号(その他) n-18

※席番号が小さい程前になるので、希望人数に合わせてくじ番号を限定する

座席表

0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18

フローチャート(ベータ版)

※ plantumlのコードは、おまけに記載しています

サンプル

備考
前の席希望者 3人
席番号(希望者) 0-2
席番号(その他) 3-18

コード

Sekigae.java
import java.io.*;
import java.util.Arrays;

public class Sekigae {
    static int KUJI_MIN, KUJI_MAX, KUJI_NUM;

    static String FILE_NAME = "test.csv";
    static Integer[] KIBOU = { 5, 10, 15 };
    static int[][] DATA = new int[18][2];
    static boolean[] KUJI = new boolean[18];

    /***
     * くじ引きで席順を決める
     *
     * @param args
     */
    public static void main(String[] args) {
        try {
            // データ取得
            DATA = getData();

            // ファイルの設定
            FileWriter fw = new FileWriter(FILE_NAME);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);

            // ファイルに出力
            pw.println("ID,番号");
            for (int[] item : DATA) {
                pw.println(item[0] + "," + item[1]);
            }
            pw.close();

        } catch (IOException e) {
            System.out.println(e);
        } finally {
            System.out.println("処理終了");
        }

    }

    /***
     * くじ引き
     *
     * @return data くじ引きの結果
     */
    private static int[][] getData() {
        for (int i = 0; i < KUJI.length; i++) {
            // 希望者かどうか
            boolean isKibou = Arrays.asList(KIBOU).contains(i);

            // 席(min~max)
            KUJI_MIN = (isKibou) ? 0 : KIBOU.length;
            KUJI_MAX = (isKibou) ? KIBOU.length : 19;

            // 判定: 重複 OR 席(min~max)
            do {
                KUJI_NUM = (int) (Math.random() * 18);
            } while (KUJI[KUJI_NUM] || ((KUJI_NUM >= KUJI_MIN) == false) || ((KUJI_NUM < KUJI_MAX) == false));

            // 確定
            DATA[i][0] = i;
            DATA[i][1] = KUJI_NUM;
            KUJI[KUJI_NUM] = true;
        }
        return DATA;
    }
}

出力されたCSV

test.csv
ID,番号
0,3
1,14
2,15
3,9
4,6
5,0
6,17
7,13
8,12
9,5
10,1
11,10
12,8
13,4
14,11
15,2
16,7
17,16

おまけ

plantumlコード(ベータ版)

Sekigae.pu
@startuml くじ引きで席替え
title くじ引きで席替え
start
start
partition くじ引き(全員) {
    ' クラスの定義
    note left
        = 定義
        ====
        === クラス
        * 人数     : 18人
        * 出席番号   : 0~17
        * 前の席希望者 : n人(複数可)
        ----
        === くじ
        * くじ   : 18個
        * 順番   : 小→大
        * 席番号  : 0~17(min~max)
        ** 希望者 : 0~(n-1)
        ** その他 : n~17
        * 使用状況
        ** 未使用[-] : false
        ** 使用済[×] : true
    end note

    repeat: 箱もらう;
      partition くじ引き(個人) {

        note left
            = 判断処理_A
            ====
            * 未使用
            * min >= くじ番号
            * くじ番号 < max
        end note

        repeat: くじを引く;
          backward :箱に戻す;
        repeat while (判断処理_A) is (No) not (Yes)
        : ・くじに「×」をつける \n ・箱に戻す;
        :紙に「出席番号」「くじ番号」を書く;
      }
      backward :次の人に渡す;
    repeat while (出席番号が18以下) is (No) not (Yes)
}
end
@enduml

フローチャート図(レガシー版)

plantumlコード(レガシー版)

@startuml くじ引きで席替え
title くじ引きで席替え
(*)--> "箱もらう"
note left
        = 定義
        ====
        === クラス
        * 人数     : 18人
        * 出席番号   : 0~17
        * 前の席希望者 : n人(複数可)
        ----
        === くじ
        * くじ   : 18個
        * 順番   : 小→大
        * 席番号  : 0~17(min~max)
        ** 希望者 : 0~(n-1)
        ** その他 : n~17
        * 使用状況
        ** 未使用[-] : false
        ** 使用済[×] : true
end note
"箱もらう" -right-> "くじを引く"
"くじを引く"-right-> "くじが未使用"
"くじが未使用" -->[no] "箱に戻す"
"箱に戻す" -->"くじを引く"
"くじが未使用" -right->[yes] "くじ番号 < max"
"くじに「×」をつけ、箱に戻す" --> "紙に「出席番号」「くじ番号」を書く"
"くじ番号 < max" -->[no] "箱に戻す"
"紙に「出席番号」「くじ番号」を書く" --> "出席番号 < 18"
"くじ番号 < max" -right->[yes] "min >= くじ番号"
"min >= くじ番号" ->[no] "箱に戻す"
"min >= くじ番号" -->[yes] "くじに「×」をつけ、箱に戻す"
"次の人に渡す" --> "箱もらう"
"出席番号 < 18" --> [no] "次の人に渡す"
"出席番号 < 18" -->  [yes] (*)
@enduml
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1