Java中ArrayList与double比较报错,求解决方法及替代方案
嘿,刚看完你的代码和遇到的报错,我来帮你理清楚问题出在哪,以及怎么搞定它~
先说说报错的原因
你遇到的Operator '>' cannot be applied to 'java.util.ArrayList>', 'double'错误,核心问题出在这段代码:
ArrayList <ArrayList <Double>> RegularReading = new ArrayList <> (); RegularReading.add (vibReadingless100); RegularReading.add (vibReadingabove100); for(Double item : RegularReading) { if (item > vibDefReading) { ctx.collect (" -- ALERT Vibration Above threshold!: " + item); } }
你定义的RegularReading是一个装着ArrayList的ArrayList(ArrayList<ArrayList<Double>>),所以当你用for(Double item : RegularReading)遍历的时候,这里的item其实是ArrayList<Double>类型,而不是你以为的单个Double数值,自然没法用>和double阈值做比较啦。
解决方案:修正遍历逻辑
既然RegularReading里存的是两个子列表(小于100的和大于100的),你需要先遍历外层的列表,再逐个遍历每个子列表里的Double元素:
// 先遍历外层的ArrayList,拿到每个存读数的子列表 for(ArrayList<Double> readingList : RegularReading) { // 再遍历子列表里的每个读数 for(Double item : readingList) { if (item > vibDefReading) { ctx.collect (" -- ALERT Vibration Above threshold!: " + item); } } }
额外的代码优化建议(新手友好)
我看你是Java新手,给你几个小建议让代码更规范高效:
- 统一变量命名风格:用小驼峰命名法(比如
vibReadingLess100代替vibReadingless100),避免大小写混乱(比如viBReading1改成vibReading6更直观); - 把阈值设为常量:把
vibDefReading改成类常量,代码可读性更高:private static final double VIBRATION_THRESHOLD = 100.0; - 避免重复创建列表:现在你把列表初始化放在
while(running)循环里,每次循环都会重新生成相同的读数和列表,如果不需要动态更新读数,可以把这部分逻辑提到循环外面; - 直接判断读数(更高效):如果你的需求只是区分两类读数并告警,其实没必要先分两个列表再合并检查,生成读数时直接判断就行:
// 示例:生成随机振动读数并直接判断 double randomVib = Math.random() * 200; // 生成0-200的随机数 if (randomVib > VIBRATION_THRESHOLD) { ctx.collect("ALERT: Vibration reading " + randomVib + " exceeds threshold!"); } else { ctx.collect("Normal: Vibration reading " + randomVib); }
修正后的完整代码参考
public class DataGen implements SourceFunction<String> { boolean running = true; // 定义阈值常量 private static final double VIBRATION_THRESHOLD = 100.0; @Override public void run(SourceContext<String> ctx) throws Exception { try{ while (running) { // 生成小于100的振动读数 ArrayList<Double> vibReadingLess100 = new ArrayList<>(); vibReadingLess100.add(65.563456); vibReadingLess100.add(75.234450); vibReadingLess100.add(85.987653); vibReadingLess100.add(95.854524); vibReadingLess100.add(98.854524); // 生成大于100的振动读数 ArrayList<Double> vibReadingAbove100 = new ArrayList<>(); vibReadingAbove100.add(110.453456); vibReadingAbove100.add(120.126543); vibReadingAbove100.add(130.827468); vibReadingAbove100.add(140.082354); vibReadingAbove100.add(150.432356); // 输出正常读数 for (int i = 0; i < 100; i++) { ctx.collect("Vibration normal Reading: " + vibReadingLess100); Thread.sleep(100); } // 输出警告读数 for (int j = 0; j < 100; j++){ ctx.collect("Vibration WARNING Reading: " + vibReadingAbove100); Thread.sleep(100); } // 合并列表并检查阈值 ArrayList<ArrayList<Double>> regularReading = new ArrayList<>(); regularReading.add(vibReadingLess100); regularReading.add(vibReadingAbove100); // 修正后的遍历逻辑 for(ArrayList<Double> readingList : regularReading) { for(Double item : readingList) { if (item > VIBRATION_THRESHOLD) { ctx.collect(" -- ALERT Vibration Above threshold!: " + item); } } } running = false; } } catch (Exception e){ e.printStackTrace(); } } @Override public void cancel() { running = false; } }
内容的提问来源于stack exchange,提问作者Stimks
相关产品推荐
相关产品推荐

