Java 动态创建布尔值列表

Java 动态创建布尔值列表,java,design-patterns,data-structures,language-agnostic,boolean,Java,Design Patterns,Data Structures,Language Agnostic,Boolean,想象一下,我们正在收集有关人们及其喜爱食物的数据。 数据的格式为:“名称,FavFood1,FavFood2..FavFoodn”。 e、 “詹姆斯,豆子,鸡肉”。注意,我们不知道一个人会喜欢多少食物。 根据这些数据,我们创建了一个人物的实例对象,该对象捕获人物的姓名和喜爱的食物在提取每个人的数据后,我们希望创建一个电子表格,其列为:Name |马铃薯|鸡肉|豆类|咖喱等。 姓名右侧的所有值都是简单的布尔值,表示该食物是否是该人的最爱。 问题是:我们事先不知道;有人可能喜欢的所有食物,因此不能只

想象一下,我们正在收集有关人们及其喜爱食物的数据。
数据的格式为:“名称,FavFood1,FavFood2..FavFoodn”。
e、 “詹姆斯,豆子,鸡肉”。
注意,我们不知道一个人会喜欢多少食物。

根据这些数据,我们创建了一个人物的实例对象,该对象捕获人物的姓名和喜爱的食物
在提取每个人的数据后,我们希望创建一个电子表格,其列为:
Name |马铃薯|鸡肉|豆类|咖喱
等。
姓名右侧的所有值都是简单的布尔值,表示该食物是否是该人的最爱。
问题是:我们事先不知道;有人可能喜欢的所有食物,因此不能只在Person类中设置布尔实例变量。

我对此进行了一些思考,实现了集合、散列集合和散列映射,但是我想到的每一个解决方案最终都非常不美观,因此我向stackoverflow的天才寻求这方面的帮助。
我的问题是:我可以使用什么设计模式/方法来干净地实现我想要的结果?
虽然这是一个语言不可知的问题,但我是用Java编程的,因此如果Java API或其他地方为此构建了什么,一定要让我知道。

提前谢谢

试试这个。它以csv形式生成数据

class Person {
  final String name;
  final Set<String> foods;

  Person(String name, Set<String> foods) {
    this.name = name;
    this.foods = foods;
  }

  Stream<Boolean> getBooleans(List<String> foods) {
    return foods.stream().map(food -> this.foods.contains(food));
  }

  @Override
  public String toString() {
    return "Person(" + name + ", " + foods +")";
  }
}

class Test {
  public static void main(String[] args) throws Exception {
    List<String> data = Arrays.asList(
      "James, Beans, Chicken",
      "Emily, Potato, Curry",
      "Clara, Beans, Curry"
    );

    List<String> foodNames = Arrays.asList(
      "Potato", "Chicken", "Beans", "Curry"
    );

    Stream<Person> persons = data.stream().map(d -> {
      String[] split = d.split(",");
      for(int i = 0; i < split.length; i++) {
        split[i] = split[i].trim();
      }
      String name = split[0];
      Set<String> foods = Stream.of(split).skip(1).collect(Collectors.toSet());
      return new Person(name, foods);
    });

    Stream<String> csvData = persons.map(p ->
      p.name + ", " + p.getBooleans(foodNames)
        .map(b -> b.toString())
        .collect(Collectors.joining(", "))
    );
    csvData.forEach(System.out::println);
  }
}
班级人员{
最后的字符串名;
最终定型食品;
Person(字符串名称、设置食物){
this.name=名称;
这就是食物;
}
Stream getBooleans(列出食物){
return foods.stream().map(food->this.foods.contains(food));
}
@凌驾
公共字符串toString(){
返回“人”(“+姓名+”,“+食品+”);
}
}
课堂测试{
公共静态void main(字符串[]args)引发异常{
List data=Arrays.asList(
“詹姆斯,豆子,鸡肉”,
“艾米丽,土豆,咖喱”,
克拉拉,豆子,咖喱
);
List foodNames=Arrays.asList(
“土豆”、“鸡肉”、“豆类”、“咖喱”
);
Stream persons=data.Stream().map(d->{
字符串[]split=d.split(“,”);
对于(int i=0;i
p、 名称+“,”+p.getBooleans(foodNames)
.map(b->b.toString())
.collect(收集器.连接(“,”))
);
csvData.forEach(System.out::println);
}
}

试试这个。它以csv形式生成数据

class Person {
  final String name;
  final Set<String> foods;

  Person(String name, Set<String> foods) {
    this.name = name;
    this.foods = foods;
  }

  Stream<Boolean> getBooleans(List<String> foods) {
    return foods.stream().map(food -> this.foods.contains(food));
  }

  @Override
  public String toString() {
    return "Person(" + name + ", " + foods +")";
  }
}

class Test {
  public static void main(String[] args) throws Exception {
    List<String> data = Arrays.asList(
      "James, Beans, Chicken",
      "Emily, Potato, Curry",
      "Clara, Beans, Curry"
    );

    List<String> foodNames = Arrays.asList(
      "Potato", "Chicken", "Beans", "Curry"
    );

    Stream<Person> persons = data.stream().map(d -> {
      String[] split = d.split(",");
      for(int i = 0; i < split.length; i++) {
        split[i] = split[i].trim();
      }
      String name = split[0];
      Set<String> foods = Stream.of(split).skip(1).collect(Collectors.toSet());
      return new Person(name, foods);
    });

    Stream<String> csvData = persons.map(p ->
      p.name + ", " + p.getBooleans(foodNames)
        .map(b -> b.toString())
        .collect(Collectors.joining(", "))
    );
    csvData.forEach(System.out::println);
  }
}
班级人员{
最后的字符串名;
最终定型食品;
Person(字符串名称、设置食物){
this.name=名称;
这就是食物;
}
Stream getBooleans(列出食物){
return foods.stream().map(food->this.foods.contains(food));
}
@凌驾
公共字符串toString(){
返回“人”(“+姓名+”,“+食品+”);
}
}
课堂测试{
公共静态void main(字符串[]args)引发异常{
List data=Arrays.asList(
“詹姆斯,豆子,鸡肉”,
“艾米丽,土豆,咖喱”,
克拉拉,豆子,咖喱
);
List foodNames=Arrays.asList(
“土豆”、“鸡肉”、“豆类”、“咖喱”
);
Stream persons=data.Stream().map(d->{
字符串[]split=d.split(“,”);
对于(int i=0;i
p、 名称+“,”+p.getBooleans(foodNames)
.map(b->b.toString())
.collect(收集器.连接(“,”))
);
csvData.forEach(System.out::println);
}
}

试试这个。它以csv形式生成数据

class Person {
  final String name;
  final Set<String> foods;

  Person(String name, Set<String> foods) {
    this.name = name;
    this.foods = foods;
  }

  Stream<Boolean> getBooleans(List<String> foods) {
    return foods.stream().map(food -> this.foods.contains(food));
  }

  @Override
  public String toString() {
    return "Person(" + name + ", " + foods +")";
  }
}

class Test {
  public static void main(String[] args) throws Exception {
    List<String> data = Arrays.asList(
      "James, Beans, Chicken",
      "Emily, Potato, Curry",
      "Clara, Beans, Curry"
    );

    List<String> foodNames = Arrays.asList(
      "Potato", "Chicken", "Beans", "Curry"
    );

    Stream<Person> persons = data.stream().map(d -> {
      String[] split = d.split(",");
      for(int i = 0; i < split.length; i++) {
        split[i] = split[i].trim();
      }
      String name = split[0];
      Set<String> foods = Stream.of(split).skip(1).collect(Collectors.toSet());
      return new Person(name, foods);
    });

    Stream<String> csvData = persons.map(p ->
      p.name + ", " + p.getBooleans(foodNames)
        .map(b -> b.toString())
        .collect(Collectors.joining(", "))
    );
    csvData.forEach(System.out::println);
  }
}
班级人员{
最后的字符串名;
最终定型食品;
Person(字符串名称、设置食物){
this.name=名称;
这就是食物;
}
Stream getBooleans(列出食物){
return foods.stream().map(food->this.foods.contains(food));
}
@凌驾
公共字符串toString(){
返回“人”(“+姓名+”,“+食品+”);
}
}
课堂测试{
公共静态void main(字符串[]args)引发异常{
List data=Arrays.asList(
“詹姆斯,豆子,鸡肉”,
“艾米丽,土豆,咖喱”,
克拉拉,豆子,咖喱
);
List foodNames=Arrays.asList(
“土豆”、“鸡肉”、“豆类”、“咖喱”
);
Stream persons=data.Stream().map(d->{
字符串[]split=d.split(“,”);
对于(int i=0;i
p、 名称+“,”+p.getBooleans(foodNames)
.map(b->b.toString())
.collect(收集器.连接(“,”))
);
csvData.forEach(System.out::println);
}
}

试试这个。它以csv形式生成数据

class Person {
  final String name;
  final Set<String> foods;

  Person(String name, Set<String> foods) {
    this.name = name;
    this.foods = foods;
  }

  Stream<Boolean> getBooleans(List<String> foods) {
    return foods.stream().map(food -> this.foods.contains(food));
  }

  @Override
  public String toString() {
    return "Person(" + name + ", " + foods +")";
  }
}

class Test {
  public static void main(String[] args) throws Exception {
    List<String> data = Arrays.asList(
      "James, Beans, Chicken",
      "Emily, Potato, Curry",
      "Clara, Beans, Curry"
    );

    List<String> foodNames = Arrays.asList(
      "Potato", "Chicken", "Beans", "Curry"
    );

    Stream<Person> persons = data.stream().map(d -> {
      String[] split = d.split(",");
      for(int i = 0; i < split.length; i++) {
        split[i] = split[i].trim();
      }
      String name = split[0];
      Set<String> foods = Stream.of(split).skip(1).collect(Collectors.toSet());
      return new Person(name, foods);
    });

    Stream<String> csvData = persons.map(p ->
      p.name + ", " + p.getBooleans(foodNames)
        .map(b -> b.toString())
        .collect(Collectors.joining(", "))
    );
    csvData.forEach(System.out::println);
  }
}
班级人员{
最后的字符串名;
最终定型食品;
Person(字符串名称、设置食物){
this.name=名称;
这就是食物;
}
Stream getBooleans(列出食物){
return foods.stream().map(food->this.foods.contains(food));
}
@凌驾
公共字符串toString(){
返回“人”(“+姓名+”,“+食品+”);
}
}
课堂测试{
公共静态void main(字符串[]args)引发异常{
List data=Arrays.asList(
“詹姆斯,豆子,鸡肉”,
“艾米丽,土豆,咖喱”,
克拉拉,豆子,咖喱
);
List foodNames=Arrays.asList(
“土豆”、“鸡肉”、“豆类”、“咖喱”
);
Stream persons=data.Stream().map(d->{
字符串[]split=d.split(“,”);
对于(int i=0;i