不区分大小写的HashMap保留原始密钥?

时间:2013-08-08 23:28:37

标签: java multidimensional-array hashmap

我需要将键存储为不区分大小写,并且像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}>
  • .get(ColoR)返回{red,blue}
  • .getKey(coLOR)返回COLOR

有关如何最好地完成此任务的任何想法?

3 个答案:

答案 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)

我建议一个有几张地图的数据结构。一个是从每个(区分大小写)键到不区分大小写的键的映射,另一个是从不区分大小写的键到值的映射。给定一个区分大小写的密钥,每次访问都是两步的:从第一个映射中找到要使用的不区分大小写的密钥,然后将密钥与第二个映射一起使用。

相关问题