0

第一次在这里发帖,我对 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”和 Value [80,90,100] 的条目和另一个带有键“Eve”和 Value [30,40,50] 的条目的 Map。至少我认为我有!

我现在希望能够返回任何包含在给定范围内的键值的名称。

例如,如果范围是 25 到 50,则返回值为“Eve”。如果范围是 50 到 85,则返回值将是“Adam”和“Eve”。

我认为 containsValue() 可能有效但无效(因为 Set?)。

任何指导将不胜感激。

4

4 回答 4

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;
}

未测试。

于 2013-04-16T16:07:46.800 回答
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;
}
于 2013-04-16T15:49:05.603 回答
0

第一眼就能想到这个算法

1)制作一个Hashset来存储关键结果

2)迭代thu map,然后是每个集合的elemnet。

3) 将其与输入范围进行比较。

4)如果它在那里,则将其添加到哈希集中。

5)就是这样

这里使用哈希集,因为它将确保唯一的键结果。

于 2013-04-16T15:54:14.417 回答
0

您必须编写一个自定义逻辑来遍历地图中每个条目的每个集合,并在它落在所需范围内时获取条目的相应键。

于 2013-04-16T15:54:28.917 回答