首先发布在这里,我对Java(以及一般的编程)非常陌生!
我正在尝试了解如何在包含其他集合时操纵地图。我正在尝试编写代码来存储名称作为映射中的整数集值的键。然后,我希望能够返回具有属于给定范围内的元素的任何值的键。
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);
我现在有一个带有Key“Adam”和Value [80,90,100]的条目的Map和另一个带有“Eve”和Value [30,40,50]的条目。至少我想我有!
我现在希望能够返回属于给定范围内的任何键保持值的名称。
例如,如果范围是25到50,则返回将是“Eve”。 如果范围是50到85,则返回将是“Adam”和“Eve”。
我认为containsValue()可能有效,但没有(因为Set?)。
任何指导都将不胜感激。
答案 0 :(得分:1)
在不改变设计的情况下,我能想到的唯一方法是迭代地图和每个值集,但效率不高:
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;
}
未经测试。
答案 1 :(得分:0)
我不认为你能用任何标准的地图方法来完成这个任务。特别是,地图非常适合通过密钥访问,而不是通过值。
我认为在这种情况下,最好创建一个自定义对象列表。自定义对象将包含值列表和字符串。当你想要获得具有该范围值的所有字符串时,你将遍历列表并用匹配的列表填充新列表。
这就是它的样子:
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;
}
答案 2 :(得分:0)
乍一看我能想到这个算法
1)制作一个Hashset来存储关键结果
2)迭代thu map,然后迭代set的每个elemnet。
3)将其与输入范围进行比较。
4)如果它位于那里,则将其添加到hashset中。
5)多数民众赞成
这里使用hashset,因为它将确保唯一的键结果。
答案 3 :(得分:0)
您必须编写一个自定义逻辑来遍历地图中每个条目的每个集合,并在条目落在所需范围内时获取该条目的相应密钥。