基于Map中TreeSet中的值范围返回键

时间:2013-04-16 15:47:12

标签: java map integer set

首先发布在这里,我对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?)。

任何指导都将不胜感激。

4 个答案:

答案 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)

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