You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中实现字符串列表与枚举字符串值最大匹配返回对应枚举的方法

解决方案

实现思路

原有代码存在笔误:getValue方法中流的数据源应为枚举实例数组Rara.values(),而非入参values。
新需求的匹配逻辑如下:

  1. 计算每个枚举关联的codes和输入列表的交集元素数量,作为匹配度数值
  2. 按匹配度倒序排序,匹配度越高优先级越高
  3. 匹配度相同时,按枚举定义的先后顺序排序(枚举天然按ordinal属性记录定义顺序,值越小定义越早)
  4. 过滤完全无匹配的枚举,取排序后的第一个值返回

完整修改代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:02