
在编程实践中,我们经常需要检查一个集合中的所有元素是否都存在于另一个集合中。例如,一个购物清单中的所有食材是否都在厨房的储藏室(pantry)中。初学者在处理这类问题时,常会遇到一些效率和逻辑上的误区。
考虑一个典型的场景:你有一个“储藏室清单”(pantry)和一个“所需食材清单”(input),目标是判断input中的所有食材是否都在pantry中。
原始代码中可能存在以下常见问题:
为了高效地解决“一个集合中的所有元素是否都存在于另一个集合中”的问题,Java集合框架中的Set接口及其实现类,尤其是HashSet,是最佳选择。
立即学习“Java免费学习笔记(深入)”;
Set 的特性与优势:
核心思想: 将包含大量元素的“被查找”列表(例如pantry)转换为HashSet。然后,遍历“查找”列表(例如input),对每个元素使用HashSet的contains()方法进行检查。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class ShoppingListChecker {
/**
* 检查所需食材列表中的所有物品是否都在储藏室中。
*
* @param pantryItems 储藏室中的物品列表
* @param requiredIngredients 所需的食材列表
* @return 如果所有所需食材都在储藏室中,返回一个空列表;否则,返回缺少的食材列表。
*/
public static List<String> checkMissingIngredients(List<String> pantryItems, List<String> requiredIngredients) {
// 将储藏室物品转换为HashSet,以便进行O(1)平均时间复杂度的查找
Set<String> pantrySet = new HashSet<>(pantryItems);
List<String> missingItems = new ArrayList<>();
// 遍历所需食材,检查每个食材是否在储藏室Set中
for (String ingredient : requiredIngredients) {
// 使用contains()方法进行高效查找
if (!pantrySet.contains(ingredient)) {
missingItems.add(ingredient); // 如果不在,则添加到缺少列表中
}
}
return missingItems;
}
/**
* 从用户处获取食材输入,直到用户输入"done"。
*
* @return 用户输入的食材列表。
*/
public static List<String> getUserIngredients() {
Scanner scanner = new Scanner(System.in);
List<String> ingredients = new ArrayList<>();
String inputLine;
System.out.println("请输入所需食材,每输入一个按回车。输入 'done' 结束:");
while (true) {
System.out.print("请输入食材:");
inputLine = scanner.nextLine().trim(); // 读取一行并去除首尾空格
if (inputLine.equalsIgnoreCase("done")) {
break; // 用户输入"done"时退出循环
}
if (!inputLine.isEmpty()) {
ingredients.add(inputLine);
}
}
// scanner.close(); // 在实际应用中,如果Scanner在main方法中创建,通常在程序结束时关闭。
// 这里作为辅助方法,不关闭以避免关闭System.in。
return ingredients;
}
public static void main(String[] args) {
// 1. 创建预设的储藏室物品列表
List<String> pantry = new ArrayList<>();
pantry.add("Bread");
pantry.add("Peanut Butter");
pantry.add("Chips");
pantry.add("Jelly");
pantry.add("Milk");
pantry.add("Eggs");
pantry.add("Sugar");
System.out.println("当前储藏室物品: " + pantry);
// 2. 获取用户输入的所需食材列表
List<String> userShoppingList = getUserIngredients();
System.out.println("您输入的所需食材: " + userShoppingList);
// 3. 调用方法检查缺少的食材
List<String> missingItems = checkMissingIngredients(pantry, userShoppingList);
// 4. 打印结果
if (missingItems.isEmpty()) {
System.out.println("恭喜!您拥有所有所需物品!");
} else {
System.out.println("您还需要购买以下物品:");
for (String item : missingItems) {
System.out.println("- " + item);
}
}
}
}checkMissingIngredients 方法:
getUserIngredients 方法:
main 方法:
通过本教程,您应该能够理解并应用HashSet来高效地解决列表元素存在性检查的问题,并掌握在Java中进行用户输入处理和构建结构化程序的技巧。
以上就是Java中利用Set高效检查列表元素是否存在的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号