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

How to define an interval list in (Android) Java?

我有一个间隔列表,每个间隔都有一个相应的字符串值,比如

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) -> "String Value 2"

我想使用一个结构 (array/collection/list),而不是多个 if/else 指令。

谢谢

您需要 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);
}

我喜欢 Coding Monk 的解决方案,它实际上可能在几十万的范围内都很好。如果你想要一个更灵活的解决方案,你可以保留一个排序的间隔对象列表。然后你可以在那个列表上执行二分查找找到对应的区间,然后用一个映射找到你的字符串对应那个区间。不过,我怀疑在这种情况下是否需要增加复杂性。

借用 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"

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

P。 S. 因为你在 Android,你可以在 android.util.Pair.

访问一个非常合适的 Pair 实现