将一组字符串映射到特定键值

时间:2017-03-11 05:19:55

标签: java algorithm

假设我有3组字符串值:

水果:苹果,浆果,香蕉

颜色:红色,蓝色,橙色

车辆:汽车,飞机,卡车

我正在寻找最有效的Java方法来检索每个集合的父值,例如:

getParentValue(" banana")--->水果

解决方案1:

创建一堆if / else语句或切换大小写:

if (fruitSet.contains(elem)) {
   return "fruit";
}
else if (colorSet.contains(elem)) {
   return "color";
} ...

这会产生O(n)查找,n是数组。

解决方案2:

创建一个将每个子项存储为父值的哈希映射

Key/Value:

apple/fruit
berry/fruit
banana/fruit
red/color
blue/color
orange/color
...

这会产生O(1)查找时间,但会在存储每个键时生成一个大的哈希映射 - 由于某种原因,这个解决方案会感觉很难看。

我正在寻找一些可能更优雅的意见或其他方法。

3 个答案:

答案 0 :(得分:1)

以下是一些代码,只有Map中有3个条目。

public static void main(String[] args) {
    Map<String, List<String>> myMap = new HashMap<>();
    myMap.put("fruit", new ArrayList<String>(Arrays.asList("apple","berry","banana")));
    myMap.put("color", new ArrayList<String>(Arrays.asList("red","blue","orange")));
    myMap.put("vehicle", new ArrayList<String>(Arrays.asList("car","plane","truck")));
    System.out.println(getKey(myMap, "blue"));
}

public static String getKey(Map<String, List<String>> map, String value) {
    for (String key : (Set<String>)map.keySet()) {
        List<String> list = map.get(key);
        if (list.contains(value)) {
            return key;
        }
    }
    return null;
}

答案 1 :(得分:1)

最好的方法绝对是您的解决方案#2:如果您希望能够查找给定成员的类别,那么最有效的方法是从成员到类别获得Map。这正是Map的用途。

(请注意,无论您的方法如何,您都必须存储所有成员。将它们存储为作为键并不比以低效率方式存储它们更难。)

答案 2 :(得分:0)

Hashmap想法非常好但是如果你想进一步改进,你可以将每个对象设置为一个整数并将其存储在一个数组中。如果你有一些名字非常长的类别,这将是很好的。

例如,

something1/very very long string
something2/very very long string

转换后:

apple/0
berry/0
banana/0
red/1
blue/1
orange/1
...
something1/i
something2/i

你的阵列将是:

arr = {"fruit", "color", ....., "very very long string", ....};

除非您的列表中有很多条目(数十或数百万),且字符串类别很长,否则它不值得。

例如,您的平均字符串大小为16个字符,并且您有一百万个不同的行,这意味着只有16 MB,这对于现代计算机来说没有任何意义,并且您只需要节省12MB作为整数。