当前位置: 首页 > 知识库问答 >
问题:

在提取的实体列表中查找重复项

姜宏盛
2023-03-14
private boolean hasDuplicates(Recipe recipe) {
    List<Recipe> currentRecipes = new ArrayList<>();

    Stream.of(this.breakfast, this.lunch, this.dinner).forEach(meal -> {
        currentRecipes.add(meal.getRecipe());
        currentRecipes.add(meal.getSnack());
    });
    currentRecipes.add(this.snack);

    return currentRecipes.contains(recipe);
    };

}

//想象所有字段的getter和setter。

public class Menuplan {
  private Meal breakfast;
  private Meal lunch;
  private Meal dinner;
  private Recipe snack;
}

public class Meal {
  private Recipe recipe;
  private Reicpe snack;
}

我用上面的方法来测试Menuplan是否已经分配了给定的食谱(作为点心或食谱)。

我想知道是否有更优雅/更短的方法来编写函数

共有2个答案

秦宜修
2023-03-14

你应该避开溪流

private boolean hasDuplicates(Recipe recipe) {
    for (Meal each : Arrays.asList(breakfast, lunch, dinner)) {
        if (each.getRecipe().equals(recipe) || each.getSnack().equals(recipe) {
            return true;
        }
    }
    return snack.equals(recipe);
}
祁远
2023-03-14

在一个流中完成所有工作的解决方案是

private boolean hasDuplicates(Recipe recipe) {
    return Stream.concat(
        Stream.of(this.breakfast, this.lunch, this.dinner)
            .flatMap(meal -> Stream.of(meal.getRecipe(), meal.getSnack())),
        Stream.of(this.snack))
   .anyMatch(Predicate.isEqual(recipe));
}

三个流元素<code>this。早餐,这个。午餐,这个。晚餐获得与调用<code>晚餐相同的处理。getRecipe()和<code>用餐。getSnack()以形成一个新流,该新流与仅包含<code>this.snack

anyMatch一旦找到满足条件的元素,就会返回true。否则,它将返回false

您可以考虑将一个不适合其他元素通用模式的元素移出Stream操作:

private boolean hasDuplicates(Recipe recipe) {
    return this.snack.equals(recipe) ||
        Stream.of(this.breakfast, this.lunch, this.dinner)
            .flatMap(meal -> Stream.of(meal.getRecipe(), meal.getSnack())
            .anyMatch(Predicate.isEqual(recipe));
}

另一种选择是

private boolean hasDuplicates(Recipe recipe) {
    return this.snack.equals(recipe) ||
        Stream.of(this.breakfast, this.lunch, this.dinner)
            .anyMatch(meal -> meal.getRecipe().equals(recipe)
                           || meal.getSnack().equals(recipe));
}
 类似资料:
  • 问题内容: 我有一个人员,我想查找重复的条目,以约束除以外的所有字段。因此,请使用-method(并因此使用),因为它们已考虑在内。 修改和方法以忽略该字段不是一种选择,因为代码的其他部分依赖于此。 如果我想忽略该字段,Java中最有效的方法是对重复项进行分类? 问题答案: 构建一个以实现您的自然键排序,然后使用基于二进制搜索的重复数据删除。即可为您提供这种能力。 请注意,必须满足通常的反对称性,

  • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

  • 问题内容: 在一个字段中查找重复项很容易: 所以如果我们有一张桌子 该查询将为我们提供John,Sam,Tom,Tom,因为它们都相同。 但是,我想要的是获取具有 和的 重复项。 也就是说,我想获得“ Tom”,“ Tom”。 我需要这个的原因:我犯了一个错误,并允许插入重复项和值。现在,我需要删除/更改重复项,因此我需要先 找到 它们。 问题答案: SELECT name, email, COU

  • 我试着解决这个数组列表问题,但没有成功 无论如何,在while循环中,我必须向ArrayList添加新的字符串项。 如果有一个重复的项目,应该有一个消息说重复的项目。 While循环将按单词结束中断

  • 问题内容: 我有一个包含以下字段和示例数据的SQL Server表: 该列的每一行都有唯一的值。 该列有重复项。 我希望能够根据该列查找重复项,并在其旁边列出重复项的s,并以逗号分隔。 以上样本数据的预期输出: 表中还有其他列我不想考虑此查询。 感谢你的帮助! 问题答案: SQL提琴手