【问题标题】:What structure should I use to store key and list of possible values?我应该使用什么结构来存储可能值的键和列表?
【发布时间】:2019-02-13 20:56:19
【问题描述】:

我想存储有关文件类型和可能的文件扩展名的信息。 我想要做的是,如果我提供文件扩展名并且此扩展名在列表中,我将为它返回密钥。

例如:

Map<Filetype, List<String>> extensionMapping= new HashMap<>();
extensionMapping.put(Filetype.IMAGE, Arrays.asList("jpg", "jpeg"));
extensionMapping.put(Filetype.WORD, Arrays.asList("doc", "docx"));
extensionMapping.put(Filetype.EXCEL, Arrays.asList("xls", "xlsx", "xlsm"));
extensionMapping.put(Filetype.PPT, Arrays.asList("ppt", "pptx", "pptm"));`

然后我想做这样的事情:

return extensionMapping.get().contains("jpg");

对于字符串“jpg”返回我Filetype.IMAGE

我应该使用哪个集合?

【问题讨论】:

  • 您的扩展似乎每个键都是唯一的,所以我会选择Map&lt;String, FileType&gt;,其中键是扩展。
  • 为什么不Map &lt;String, Filetype&gt; 这是你最常见的查询?
  • 我觉得现在的也不错`Map>
  • EnumMap 是一个更好的容器,适用于密钥为单个 Enum 类型的情况。

标签: java collections


【解决方案1】:

我会创建一个反向映射,键是扩展名,值是文件类型:

Map<String, Filetype> byExtension = new HashMap<>();
extensionMapping.forEach((type, extensions) -> 
        extensions.forEach(ext -> byExtension.put(ext, type)));

现在,对于给定的扩展,您只需:

FileType result = byExtension.get("jpg"); // FileType.IMAGE

【讨论】:

【解决方案2】:

我的意思是你现在也可以通过使用相同的结构 Map&lt;Filetype, List&lt;String&gt;&gt; 来做到这一点。在Map 中的任何值(即包含"jpg" 的字符串列表)都将返回Filetype.IMAGE,否则它将返回Filetype.None

extensionMapping.entrySet().stream().filter(entry->entry.getValue().contains("jpg")).map(Map.Entry::getKey)
      .findFirst().orElse(Filetype.None);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多