[英]Return Key Based on Range of Values in a TreeSet within Map
在这里的第一篇文章,我对Java(以及一般编程)还是很陌生!
我试图了解当地图包含其他集合时如何操作。 我正在尝试编写代码以将名称存储为与Map中整数集相对的值的键。 然后,我希望能够返回具有属于给定范围内的元素的任何值的键。
Map<String, Set<Integer>> index = new TreeMap<>();
Set<Integer> numbers = new TreeSet<>;
numbers.add(80);
numbers.add(90);
numbers.add(100);
index.put("Adam", numbers);
numbers = new TreeSet<>();
numbers.add(30);
numbers.add(40);
numbers.add(50);
index.put("Eve", numbers);
现在,我有了一个映射,键为“ Adam”且值为[80、90、100],另一个键为“ Eve”且值为[30、40、50]。 至少我认为我有!
现在,我希望能够返回落在给定范围内的所有键保持值的名称。
例如,如果范围是25到50,则返回值将为“ Eve”。 如果范围是50到85,则返回均为“ Adam”和“ Eve”。
我以为containsValue()可能有效,但不起作用(因为Set?)。
任何指导将不胜感激。
在不更改您的设计的情况下,我唯一想到的方法是遍历地图和每个值集,但效率不高:
public Set<String> containsRange(Map<String, Set<Integer>> index, int lowerBound, int upperBound){
Set<String> result = new HashSet<>();
for (Map.Entry<String, Set<Integer>> entry : index.entrySet()) {
String string = entry.getKey();
for (Integer integer : entry.getValue()) {
if (integer >= lowerBound && integer <= upperBound) {
result.add(string);
break;
}
}
}
return result;
}
未经测试。
我认为您将无法使用任何标准地图方法来完成此任务。 特别是,地图非常适合通过键而不是通过值访问事物。
我认为在这种情况下,最好创建一个自定义对象列表。 自定义对象将包含值列表和字符串。 当您想要获得所有具有该范围内的值的字符串时,可以遍历列表,并用匹配的列表填充新列表。
如下所示:
List<RangedString> index = new ArrayList<RangedString>();
...
public List<String> getStringInRange(int low, int high) {
List<String> results = new ArrayList<String>();
for (RangedString rangedString : index) {
if (rangedString.inRange(low, high)) {
results.add(rangedString.getString());
}
}
}
RangedString.inRange
方法如下所示:
Set<Integer> values;
...
public boolean inRange(int low, int high) {
for (Integer value : values) {
if (value >= low && value <= high) {
return true;
}
}
return false;
}
我可以乍一看这个算法
1)制作一个哈希表来存储关键结果
2)迭代星期四图,然后迭代集合的每个元素。
3)将其与输入范围进行比较。
4)如果存在,则将其添加到哈希集中。
5)就这样
在这里使用哈希集将确保唯一的键结果。
您必须编写一个自定义逻辑,以遍历映射中每个条目的每个集合,并在条目的期望范围内获得相应的键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.