Java中如何根据Scanner用户输入自动选择对应ArrayList取随机值
实现方案
你提到的逻辑完全可行,只需要提前声明一个通用的ArrayList<String>类型的变量承接匹配到的列表,后续直接操作该变量即可。
首先需要修正你现有代码的两个问题:
- 当前定义的所有餐品列表都是空的,实际使用前需要先添加具体餐品内容,否则随机取值时会触发索引越界异常
- 现有
GetRandomFromList类里的outputMeal方法调用randomList时没有传入列表参数,会编译报错
修改后的Main类代码
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Hi, welcome to Recipe-Randomizer! What kind of meal do you want, breakfast, lunch or maybe dinner?"); System.out.print("Type one of the give choices now: "); String mealType = scanner.nextLine(); System.out.print("So you want to eat for " + mealType + ". Do you want to eat some sweet or savory " + mealType + "?\nType in one of the given choices: "); String flavor = scanner.nextLine(); System.out.println("A " + flavor + " " + mealType + "? Well, let's see what we have here.\nI am going to pick a random recipe.\nPlease wait..."); // 初始化餐品列表,可自行补充内容 ArrayList<String> breakfastSweet = new ArrayList<>(); breakfastSweet.add("松饼"); breakfastSweet.add("甜豆浆"); breakfastSweet.add("红糖发糕"); ArrayList<String> breakfastSavory = new ArrayList<>(); breakfastSavory.add("肉包子"); breakfastSavory.add("咸豆浆"); breakfastSavory.add("煎饼果子"); ArrayList<String> lunchSweet = new ArrayList<>(); lunchSweet.add("糖醋排骨"); lunchSweet.add("菠萝咕咾肉"); ArrayList<String> lunchSavory = new ArrayList<>(); lunchSavory.add("红烧牛肉面"); lunchSavory.add("回锅肉盖饭"); ArrayList<String> dinnerSweet = new ArrayList<>(); dinnerSweet.add("西米露"); dinnerSweet.add("南瓜粥"); ArrayList<String> dinnerSavory = new ArrayList<>(); dinnerSavory.add("小龙虾"); dinnerSavory.add("烤串"); // 声明承接匹配结果的列表变量 ArrayList<String> targetList = null; // 按条件匹配对应列表 if (mealType.equals("breakfast") && flavor.equals("sweet")) { targetList = breakfastSweet; } else if (mealType.equals("breakfast") && flavor.equals("savory")) { targetList = breakfastSavory; } else if (mealType.equals("lunch") && flavor.equals("sweet")) { targetList = lunchSweet; } else if (mealType.equals("lunch") && flavor.equals("savory")) { targetList = lunchSavory; } else if (mealType.equals("dinner") && flavor.equals("sweet")) { targetList = dinnerSweet; } else if (mealType.equals("dinner") && flavor.equals("savory")) { targetList = dinnerSavory; } // 异常校验,避免用户输入不符合选项的内容 if (targetList == null || targetList.isEmpty()) { System.out.println("输入的餐品类型或口味不符合要求,未匹配到对应餐品"); return; } // 调用工具类输出结果 GetRandomFromList.outputMeal(targetList); } }
修改后的GetRandomFromList类代码
import java.util.ArrayList; import java.util.Random; public class GetRandomFromList { private static String randomList(ArrayList<String> list) { Random rand = new Random(); return list.get(rand.nextInt(list.size())); } public static void outputMeal(ArrayList<String> list){ System.out.println("What about " + randomList(list) + "?"); } }
可选优化方案
如果不想写大量if判断,可以用嵌套Map存储所有餐品,匹配逻辑会更简洁:
// 初始化嵌套Map,外层key为餐品类型,内层key为口味 Map<String, Map<String, ArrayList<String>>> mealMap = new HashMap<>(); // 写入早餐数据 Map<String, ArrayList<String>> breakfastMap = new HashMap<>(); breakfastMap.put("sweet", breakfastSweet); breakfastMap.put("savory", breakfastSavory); mealMap.put("breakfast", breakfastMap); // 按相同逻辑写入午餐、晚餐数据... // 匹配列表只需一行代码 ArrayList<String> targetList = mealMap.getOrDefault(mealType, Collections.emptyMap()).get(flavor);
内容的提问来源于stack exchange,提问作者Vincenzo
相关产品推荐
相关产品推荐

