Java中实现字符串列表与枚举字符串值最大匹配返回对应枚举的方法
解决方案
实现思路
原有代码存在笔误:getValue方法中流的数据源应为枚举实例数组Rara.values(),而非入参values。
新需求的匹配逻辑如下:
- 计算每个枚举关联的
codes和输入列表的交集元素数量,作为匹配度数值 - 按匹配度倒序排序,匹配度越高优先级越高
- 匹配度相同时,按枚举定义的先后顺序排序(枚举天然按
ordinal属性记录定义顺序,值越小定义越早) - 过滤完全无匹配的枚举,取排序后的第一个值返回
完整修改代码
import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; public enum Rara { MA_ON("ST"), MA_MAN("ST", "YS"), MA_IP("ST", "YS", "IC"), CODE("RC"); Rara(String... codes) { this.codes = List.of(codes); } private final List<String> codes; public static Optional<Rara> getValue(List<String> values){ // 输入转Set提升contains查询效率,List的contains为O(n),Set为O(1) Set<String> inputSet = new HashSet<>(values); return Arrays.stream(Rara.values()) .sorted((e1, e2) -> { long count1 = e1.codes.stream().filter(inputSet::contains).count(); long count2 = e2.codes.stream().filter(inputSet::contains).count(); // 优先按匹配数倒序 if (count1 != count2) { return Long.compare(count2, count1); } // 匹配数相同则按定义顺序升序,先定义的优先级更高 return Integer.compare(e1.ordinal(), e2.ordinal()); }) // 过滤完全无匹配的枚举,若需求允许全不匹配时返回第一个枚举可删除该行 .filter(rara -> rara.codes.stream().anyMatch(inputSet::contains)) .findFirst(); } } public class Main { public static void main(String args[]){ System.out.println(Rara.getValue(Arrays.asList("ST", "YS"))); // 输出:Optional[MA_MAN] System.out.println(Rara.getValue(Arrays.asList("ST"))); // 输出:Optional[MA_ON] System.out.println(Rara.getValue(Arrays.asList("ST", "YS", "IC", "BLABLA"))); // 输出:Optional[MA_IP] System.out.println(Rara.getValue(Arrays.asList("ST", "Bla", "Blabla", "BLABLA"))); // 输出:Optional[MA_ON] System.out.println(Rara.getValue(Arrays.asList("ST", "RC"))); // 输出:Optional[MA_ON] 符合冲突优先规则 } }
逻辑验证
所有测试用例输出均符合需求:
- 输入包含冗余字段时,会优先选择匹配到关联字符串最多的枚举
- 匹配度相同时,优先返回定义顺序靠前的枚举
- 完全无匹配时返回
Optional.empty(),可根据业务需求调整是否保留过滤逻辑
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

