【问题标题】:Sorting a group of people based on preferences根据喜好对一组人进行排序
【发布时间】:2020-04-26 05:37:42
【问题描述】:

我正在设计一个组生成器,它接受诸如“混合性别”、“混合国籍”之类的偏好……我正在将学生姓名列表,然后是国籍和基因集放在一个数组列表中。根据用户输入生成组的最简单方法是什么,每个组由来自不同国籍或平衡性别的人组成。

 public ArrayList<String> readEachWord(String className)
    {
        ArrayList<String> readword = new ArrayList<String>();
        Scanner sc2 = null;
        try {
        sc2 = new Scanner(new File(className + ".txt"));
    } catch (FileNotFoundException e) {

        System.out.println("error, didnt find file");
        e.printStackTrace();  
    }
    while (sc2.hasNextLine()) {
            Scanner s2 = new Scanner(sc2.nextLine());
        while (s2.hasNext()) {
            String s = s2.next();
            readword.add(s);
        }
    }
    return readword;


    }

我正在使用它来读取一个文本文件,在每一行上,我都有每个学生的姓名国籍和性别。我将它们放入一个 ArrayList 中,现在正试图弄清楚如何根据用户所需的组号均匀分布它们。

我正在使用一个 txt 文件来存储所有信息,因为这个组生成器是为我的学校定制的。

【问题讨论】:

  • 发布最小示例和代码,以防您尝试过任何事情。
  • 到目前为止你写了什么,它以什么方式失败了?
  • 请举例或描述更多!

标签: java sorting arraylist grouping preferences


【解决方案1】:

这里有一些东西可以帮助您入门。这个简短的算法将根据指定的鉴别器(国籍、性别等)对人进行排序,然后将他们平均分配到指定数量的组中。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Main {

    private static class Person {
        private String nationality;
        private String gender;

        public Person(String nationality, String gender) {
            this.nationality = nationality;
            this.gender = gender;
        }


        public String getNationality() {
            return nationality;
        }

        public String getGender() {
            return gender;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "nationality='" + nationality + "'" +
                    ", gender='" + gender + "'" +
                    "}";
        }
    }

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("DE", "male"),
            new Person("DE", "female"),
            new Person("DE", "n/a"),
            new Person("UK", "female"),
            new Person("UK", "female"),
            new Person("UK", "female"),
            new Person("JP", "trans"),
            new Person("JP", "male")
        );


        int number_of_groups = 3;

        Function<Person, String> discriminator = Person::getGender;

        AtomicInteger index = new AtomicInteger();
        List<List<Person>> groups = new ArrayList<>(people.stream()
                .sorted(Comparator.comparing(discriminator))
                .collect(Collectors.groupingBy(e -> index.getAndIncrement() % number_of_groups))
                .values());

        groups.forEach(System.out::println);
    }
}

输出:

[Person{nationality='DE', gender='female'}, Person{nationality='UK', gender='female'}, Person{nationality='JP', gender='trans'}]
[Person{nationality='UK', gender='female'}, Person{nationality='DE', gender='male'}]
[Person{nationality='UK', gender='female'}, Person{nationality='DE', gender='n/a'}]

【讨论】:

  • 哇,结果如此惊人!即使它成功了,这段代码对我的水平来说还是非常先进的。您介意解释一下这是如何工作的吗?
  • 哇这太神奇了!!一个问题:如果偏好只有一个,这个算法会是什么?对不起,我还是不太明白前面。 @休伯特
  • 你的意思是如果组数是一个?好吧,你会得到一组。玩它,伙计:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2021-11-11
  • 2012-12-01
  • 2011-04-05
相关资源
最近更新 更多