获取具有多个可能的键名称的地图的值

时间:2017-08-10 17:46:58

标签: java java-8

我正在分析一组结构化数据,并且我有一组类似的关键名称

(例如:GENDER_ATTRIBUTE = {sex, gender}

然后我有一个数据集可以将前一个数组中的一个键作为键,我需要获取它的值。

例如:

name: ABC,
address: XYZ,
gender: F

OR

name: ABC,
address: XYZ,
sex: F

最后,我需要获得GENDER_ATTRIBUTE = F等结果。

我绝对可以使用迭代方法来针对数据集检查数组的每个项目,但我想知道是否有更好的方法来实现这一点。

更新

目前,数据集实现为LinkedHashMap,属性名称存储在String数组中。

2 个答案:

答案 0 :(得分:2)

对于上面的例子,我想不出比迭代检查更好的方法。您必须为每个可能的密钥进行一次比较,因此找到您的值所花费的时间将是O(n),其中n是可能的密钥数。如果n为“小” - 例如,n=2如上所述,则没有任何改进可以改善。

如果 n,可能的密钥数量会变大,您可以使用地图来改善查找时间,即:为其唯一属性构建其他密钥映射。在这种情况下,sexgender都会映射到GENDER_ATTRIBUTE

  1. 获取输入(键:值) - 您的示例值为F,密钥可以为sexgender
  2. 查看密钥:属性映射以查找该密钥的属性 - 在您的示例GENDER_ATTRIBUTE
  3. return attribute:value - 在您的示例GENDER_ATTRIBUTE:F
  4. 虽然在时间复杂度方面,这只有在有许多不同的可能密钥时才有意义,即使使用适量的密钥,它也可以大大提高可读性。

答案 1 :(得分:1)

我假设您正在尝试使用单个标准键之类的内容来表示可以由多个不同标签表示的地图。与您的示例中一样:您希望使用GENDER_ATTRIBUTE作为等于sexgender标签的键,对吧?

如果是这样,请考虑以下示例:

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

final class MapTest {

    private static final Map<String, List<String>> similarKeys = new HashMap<String, List<String>>() {{
        put("GENDER_ATTRIBUTE", Arrays.asList("sex", "gender"));
    }};

    public static void main(String[] args) {

        final Map<String, Object> dataSet1 = new HashMap<String, Object>() {{
            put("name", "ABC");
            put("address", "XYZ");
            put("gender", "F");
        }};

        final Map<String, Object> dataSet2 = new HashMap<String, Object>() {{
            put("name", "ABC");
            put("address", "XYZ");
            put("sex", "F");
        }};

        System.out.println("GENDER_ATTRIBUTE from dataSet1 is " + getValueForKey("GENDER_ATTRIBUTE", dataSet1));
        System.out.println("GENDER_ATTRIBUTE from dataSet2 is " + getValueForKey("GENDER_ATTRIBUTE", dataSet1));
    }

    private static Object getValueForKey(String key, Map<String, Object> dataSet) {
        final String finalKey = similarKeys.getOrDefault(key, Collections.emptyList())
                .stream()
                .filter(it -> dataSet.keySet().contains(it))
                .findFirst()
                .orElse(key);

        return dataSet.get(finalKey);
    }
}

这里发生的是首先我们定义similarKeys映射 - 将单个键与多个不同标签相关联的映射。然后将整个逻辑封装在getValueForKey(String key, Map<String, Object> dataSet)中。此方法检查传递的密钥是否为最终密钥,或者是否指向一个类似的密钥。如果是,则检查在给定数据集中可以找到哪个密钥。如果这是您的期望,请告诉我。这个问题不准确,所以我不得不做出一些假设来准备这个答案。我希望它有所帮助。