如何利用HashSet检查多个字符串长度?优化输入校验方案
这问题我之前也碰到过,一堆嵌套的if-else确实看着闹心,给你几个更优雅的方案,既能解决校验问题,代码还清爽:
方案一:用Stream API批量校验(最简洁)
先别着急把字符串塞HashSet,先把所有输入收集到数组里,用Java 8+的Stream快速判断有没有不符合规则的内容:
// 把六个文本框的输入统一收集到数组 String[] inputs = { jtfFirstWord.getText(), jtfSecondWord.getText(), jtfThirdWord.getText(), jtfFourthWord.getText(), jtfFifthWord.getText(), jtfSixthWord.getText() }; // 定义允许的长度集合,比写一堆==直观多了 Set<Integer> allowedLengths = Set.of(7, 9, 11); // 检查是否存在长度不符合的字符串,找到一个就停止遍历 boolean hasInvalidInput = Arrays.stream(inputs) .anyMatch(str -> !allowedLengths.contains(str.length())); if (hasInvalidInput) { JOptionPane.showMessageDialog(null, "只能输入7、9或11个字符的单词"); } else { // 校验通过后,再存入HashSet Set<String> accept = new HashSet<>(Arrays.asList(inputs)); // 这里写后续业务逻辑 }
方案二:提取校验工具方法(复用性拉满)
如果以后其他地方也要用到类似的长度校验,把校验逻辑单独封装成方法,代码可读性和维护性都会更好:
// 单独封装的校验方法,一目了然 private static boolean isLengthValid(String str) { int len = str.length(); return len == 7 || len == 9 || len == 11; } // 调用的时候就很简洁 String[] inputs = { /* 六个输入字符串 */ }; boolean hasInvalidInput = Arrays.stream(inputs).anyMatch(str -> !isLengthValid(str)); if (hasInvalidInput) { JOptionPane.showMessageDialog(null, "只能输入7、9或11个字符的单词"); } else { Set<String> accept = new HashSet<>(Arrays.asList(inputs)); // 后续逻辑 }
关于用HashSet校验的小提醒
你之前直接把六个字符串塞进HashSet,但要注意:HashSet会自动去重,如果两个输入框内容重复,HashSet里只会留一份。但输入校验是要针对每个文本框的内容的——哪怕两个输入重复,只要长度不符合,都得提示用户。所以一定要先做校验,通过之后再存HashSet,别用HashSet来做校验。如果确实只关心去重后的内容是否合法,那可以这么遍历HashSet:
Set<String> accept = new HashSet<>(Arrays.asList(inputs)); Set<Integer> allowedLengths = Set.of(7,9,11); boolean hasInvalid = accept.stream().anyMatch(str -> !allowedLengths.contains(str.length()));
但这种场景很少,还是推荐先校验再存集合的方式。
内容的提问来源于stack exchange,提问作者user7596556
相关产品推荐
相关产品推荐

