如何在(Android)Java中定义间隔列表?

时间:2015-09-09 18:34:18

标签: java android arrays set intervals

我有一个间隔列表,每个间隔都有一个相应的字符串值,类似于

1-10 -> "String Value 1"
11-50 -> "String Value 2"
51-63 -> "String Value 3"
64-1000 -> "String Value 4"
1001-100000 -> "String Value 5"
etc.

然后我必须以最佳方式获取任何数字的字符串值:

getStringValue(40) - > “字符串值2”

我想使用一个结构(数组/集合/列表),而不是多个if / else instuctions。

谢谢

3 个答案:

答案 0 :(得分:1)

借用Ruby的页面,你可以做一个将一对值映射到结果的数据结构,如下所示:

Map<Pair<Integer, Integer>, String> mapping = new HashMap<Pair<Integer, Integer>, String>();
mapping.add(new Pair<Integer, Integer>(1, 10), "String Value 1");
mapping.add(new Pair<Integer, Integer>(11, 50), "String Value 2");
// ...
mapping.add(new Pair<Integer, Integer>(1001, 100000), "String Value 5");

然后,您可以执行以下操作:

public String getStringValue(int x) {
    for (Pair<Integer, Integer> range : mapping.keySet()) {
        if (x >= range.first && x <= range.second) {
            return mapping.get(range);
        }
    }
    return null;  // or throw exception, or whatever
}

请记住,您的范围会重叠,因为您已在问题中对其进行了定义,因此您需要适当地处理边缘。我的实现假设您的范围是包含下限和上限独占的;使用给定的值,1将解析为"String Value 1",但10将解析为"String Value 2"

编辑我修改了范围以匹配原始问题的编辑。所有范围和上面的逻辑都包括上限和下限。

<强> P上。 S。由于您使用的是Android,因此您可以在android.util.Pair访问完全合适的Pair实现。

答案 1 :(得分:0)

您需要Map<Integer, String>将数字映射到正确的类别。地图的条目将如下所示:

1 => String Value 1
2 => String Value 1
...
10 => String Value 2
...
60 => String Value 3
etc...

您可以通过迭代间隔并将正确的值放入地图来构建它,例如:

for (int n : interval) {
    map.put(n, intervalStringValue);
}

答案 2 :(得分:0)

我喜欢Coding Monk的解决方案,它实际上可能达到数十万的范围。如果您需要更灵活的解决方案,可以保留间隔对象的排序列表。然后,您可以在该列表上执行二进制搜索以查找相应的间隔,然后使用映射查找与该间隔对应的字符串。我怀疑在这种情况下需要增加的复杂性。