我需要将键存储为不区分大小写,并且像STATE / state / State这样的键的所有值都合并到一个Set中。然而,问题是我需要在某些时候返回原始密钥的区分大小写的版本,因此通用的CaseInsensitiveMap不起作用。我只需要添加'state'的第一个大写,所以在这种情况下我保持STATE并丢弃州/州。
我已经查看了few options来实现这个数据结构,比如Guava HashMultimap和Tuples,但似乎都没有。
<CaseInsensitiveOriginalKey, OriginalKey, Set<Values>>
例如,如果我添加一个值为'State'且值为{Texas,Oklahoma}的密钥,它将被存储为:
<state, State, {Texas, Oklahoma}>
我的想法是,如果我创建某种.add(StATe,{Nebraska}),那么地图,看到“状态”的不区分大小写的条目已经存在,变为:
<state, State, {Texas, Oklahoma, Nebraska}>
和新密钥,.add(COLOR,{蓝色,红色})
整个地图变为:
<state, State, {Texas, Oklahoma, Nebraska}>
<color, COLOR, {blue, red}>
有关如何最好地完成此任务的任何想法?
答案 0 :(得分:2)
您可以维护两张地图:
一个是Map<String, Set<String>>
,它将不区分大小写的键映射到相应的字符串集(例如"state" → {"Texas", "Oklahoma"}
)。
另一个是Map<String, String>
,它将不区分大小写的密钥映射到其对应的区分大小写的密钥(例如"state" → "State"
)。
您可以创建自己的类,将这两个地图作为私有字段,并确保在添加/删除/更新配对时它们保持同步。
答案 1 :(得分:2)
您需要的是Map<CaseInsensitiveOriginalKey, Record>
,其中Record
是一个自定义类,其原始(区分大小写)键和值集作为属性。
您可以使用通用的Pair
类而不是自定义的Record类,但(IMO)可能会设计不佳。
但是,您的要求存在问题:
然而,问题是我需要原始密钥的区分大小写版本...
您的示例表明您可以拥有原始密钥的多个区分大小写的版本;即你首先看到的那个(例如“状态”)和随后的那个(例如“状态”,“状态”等)。那么正确的原始密钥使用哪个?那么你看到的第一个是......呃......笨蛋?
重点是,将您看到的第一个版本视为最终版本/首选版本将会出现问题。你需要某些东西(或某人)才能明智地找出最终版本 。要做到这一点,您可能需要保留所见的所有版本,直到(至少)您完成初始数据捕获阶段。你甚至可能需要保持他们的频率和/或他们的背景。
答案 2 :(得分:0)
我建议一个有几张地图的数据结构。一个是从每个(区分大小写)键到不区分大小写的键的映射,另一个是从不区分大小写的键到值的映射。给定一个区分大小写的密钥,每次访问都是两步的:从第一个映射中找到要使用的不区分大小写的密钥,然后将密钥与第二个映射一起使用。