Как случайным образом назначить сотрудников из списка на 4 разные группы - PullRequest
0 голосов
/ 09 октября 2019

да извините, за путаницу! мои бизнес-требования: объект Employee, содержащий список сотрудников, и у каждого сотрудника есть groupNumber (1-4);и я хочу, чтобы сотрудники приобрели опыт во всех других группах, включая их собственные. В каждой группе я хочу видеть как минимум 1 сотрудника из разных групп (в идеале будет 4 сотрудника в новых сгенерированных группах из разных групп). Код ниже выполняет случайные заказы, что я должен использовать, чтобы применить условия выше. Спасибо за любые предложения.

public class EmployeeTest {

    public static void main(String[] args) {
        Random random = new Random();
        int group_num = random.nextInt(30);
        int max = 0;

        if(max > 4) {
            group_num = 1;
            ArrayList<Employee> emps = new ArrayList();

            emps.add(new Employee("Tom", "Technology", 56, 34, 46, 23));
            emps.add(new Employee("Nick", "Technology", 65, 33, 21, 23));
            emps.add(new Employee("Jerry", "Technology", 56, 34, 46, 23));
            emps.add(new Employee("Janet", "Technology", 56, 34, 46, 23));
            emps.add(new Employee("Chitra", "Trading", 12, 54, 46, 23));
            emps.add(new Employee("Sally", "Trading", 16, 64, 46, 23));

            for(Employee e : emps) {
    //          Random random = new Random();
    //          int group_num = random.nextInt(30);
    //          int max =0;
    //          if(max > 4) {
    //              group_num = 1;

            }

            System.out.println("Employee | identifier: " + e.getUnicIdentifier() 
                + ", department: " + e.getDepartment()
                + ", texh_exp: " +  e.getTech_exp() 
                + " , trade_exp: " + e.getTrade_exp()
                + " , op_exp: " + e.getOp_exp()
                + ", shared_exp: " + e.getShared_exp()
                + ", group_num: " + group_num);
        }
    }
}

Ответы [ 3 ]

5 голосов
/ 09 октября 2019

Как насчет https://stackoverflow.com/a/21743854/1160106?

Collections.shuffle(emps);

Затем разделите это на 4 группы подряд.

Вот как вы можете разделить их на 4 группы

    int nGroups = 4;
    final AtomicInteger counter = new AtomicInteger();
    final Collection<List<Employee>> allGroups = emps.stream()
            .collect(Collectors.groupingBy(it -> counter.getAndIncrement() % nGroups))
            .values();

allGroups будет иметь размер 4. Каждый из них содержит сотрудников случайным образом.

0 голосов
/ 09 октября 2019

Вы можете выполнить итерацию всех Employee с, сгенерировать случайное число от 1 до 4 для каждого из них и решить, к какой группе должен идти текущий Employee, исходя из этого числа:

public static void main(String[] args) {
    List<String> employees = new ArrayList<>();
    employees.add("Employee 01");
    employees.add("Employee 02");
    employees.add("Employee 03");
    employees.add("Employee 04");
    employees.add("Employee 05");
    employees.add("Employee 06");
    employees.add("Employee 07");
    employees.add("Employee 08");
    employees.add("Employee 09");
    employees.add("Employee 10");

    List<String> employeeGroupOne = new ArrayList<>();
    List<String> employeeGroupTwo = new ArrayList<>();
    List<String> employeeGroupThree = new ArrayList<>();
    List<String> employeeGroupFour = new ArrayList<>();

    employees.forEach(employee -> {
        // generate a random number between 1 and 4 (each inclusive)
        int groupNo = ThreadLocalRandom.current().nextInt(1, 5);

        // then decide which group gets the employee based on the random number
        switch (groupNo) {
        case 1:
            employeeGroupOne.add(employee);
            break;
        case 2:
            employeeGroupTwo.add(employee);
            break;
        case 3:
            employeeGroupThree.add(employee);
            break;
        case 4:
            employeeGroupFour.add(employee);
            break;
        default:
            System.out.println("Hmmm... What happened?");
            break;
        }
    });

    System.out.println("Group 1:");
    employeeGroupOne.forEach(System.out::println);
    System.out.println();

    System.out.println("Group 2:");
    employeeGroupTwo.forEach(System.out::println);
    System.out.println();

    System.out.println("Group 3:");
    employeeGroupThree.forEach(System.out::println);
    System.out.println();

    System.out.println("Group 4:");
    employeeGroupFour.forEach(System.out::println);
    System.out.println();
}

Этот код не использует Random, потому что, начиная с Java 7, больше нет необходимости в экземпляре Random, и вы можете сделать это в одной строке.

Этот примерделается только с String с вместо Employee с, чтобы уменьшить код.

0 голосов
/ 09 октября 2019

Просто используйте связанный параметр nextInt (int bound), чтобы ограничить сгенерированное целое число между 0 и 3, как указано в javadoc.

Random random = new Random();
for(Employee e : emp) {
     int group_num = random.nextInt(4);

     System.out.println("Employee | identifier: " + e.getUnicIdentifier() + ", department: " + e.getDepartment() + ", texh_exp: " +  e.getTech_exp() + " , trade_exp: " + e.getTrade_exp() +
                    " , op_exp: " + e.getOp_exp() + ", shared_exp: " + e.getShared_exp() + ", group_num: " + group_num);
}

И не создавайте новый Random в каждой итерациипетля.

...