我有一个间隔列表,每个间隔都有一个相应的字符串值,类似于
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。
谢谢
答案 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的解决方案,它实际上可能达到数十万的范围。如果您需要更灵活的解决方案,可以保留间隔对象的排序列表。然后,您可以在该列表上执行二进制搜索以查找相应的间隔,然后使用映射查找与该间隔对应的字符串。我怀疑在这种情况下需要增加的复杂性。