假设我有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)查找时间,但会在存储每个键时生成一个大的哈希映射 - 由于某种原因,这个解决方案会感觉很难看。
我正在寻找一些可能更优雅的意见或其他方法。
答案 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作为整数。