如何在整数范围列表中高效搜索-java

如何在整数范围列表中高效搜索-java,java,list,hashmap,range,Java,List,Hashmap,Range,如何在整数范围列表内高效搜索? 我有一些重复值的范围列表。如果输入的数字在范围内,我想得到值 e、 g 射程起点 靶场端 价值 10 75 A. 95 200 A. 300 455 B 570 650 C 201 250 A. 255 275 B 您可以使用的范围图: RangeMap<Integer, Character> rangeMap = TreeRangeMap.create(); rangeMap.put(Range.closed(10, 75), 'A'); range

如何在整数范围列表内高效搜索?

我有一些重复值的范围列表。如果输入的数字在范围内,我想得到值

e、 g

射程起点 靶场端 价值 10 75 A. 95 200 A. 300 455 B 570 650 C 201 250 A. 255 275 B 您可以使用的
范围图

RangeMap<Integer, Character> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(10, 75), 'A');
rangeMap.put(Range.closed(95, 200), 'A');
rangeMap.put(Range.closed(300, 455), 'B');
rangeMap.put(Range.closed(570, 650), 'C');
rangeMap.put(Range.closed(201, 250), 'A');
rangeMap.put(Range.closed(255, 275), 'B');

Character character = rangeMap.get(61);
Character character2 = rangeMap.get(244);
Character character3 = rangeMap.get(270);

System.out.println(character);
System.out.println(character2);
System.out.println(character3);
注意:由于某些原因,它被标记为
@Beta
,因此我想确定它是否适合生产使用。

您可以使用的
RangeMap

RangeMap<Integer, Character> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(10, 75), 'A');
rangeMap.put(Range.closed(95, 200), 'A');
rangeMap.put(Range.closed(300, 455), 'B');
rangeMap.put(Range.closed(570, 650), 'C');
rangeMap.put(Range.closed(201, 250), 'A');
rangeMap.put(Range.closed(255, 275), 'B');

Character character = rangeMap.get(61);
Character character2 = rangeMap.get(244);
Character character3 = rangeMap.get(270);

System.out.println(character);
System.out.println(character2);
System.out.println(character3);

注意:出于某种原因,它标有
@Beta
,因此我想确定它是否适合生产使用。

为什么不试试三条if-else语句

假设:范围的起始值和结束值被视为给定范围内的值。

“D”表示给定值不属于任何定义的范围值

示例代码:

 public static char findRangeValue(int number){

        if((number >= 10 && number <=75) ||(number >= 95 && number <=250) ){
            return 'A';
        }else if((number >= 255 && number <=275) ||(number >= 300 && number <=455)  ){
            return 'B';
        }else if(number >= 570 && number <=650 ){
            return 'C';
        }
           return 'D';
    }

产出:

B
A
C

你为什么不试试三个if-else语句呢

假设:范围的起始值和结束值被视为给定范围内的值。

“D”表示给定值不属于任何定义的范围值

示例代码:

 public static char findRangeValue(int number){

        if((number >= 10 && number <=75) ||(number >= 95 && number <=250) ){
            return 'A';
        }else if((number >= 255 && number <=275) ||(number >= 300 && number <=455)  ){
            return 'B';
        }else if(number >= 570 && number <=650 ){
            return 'C';
        }
           return 'D';
    }

产出:

B
A
C

您可以使用
TreeMap
Entry
来完成它,就像使用常规Java一样。 如果提供的参数不存在范围,则返回
notfound

这是包含范围的地图

  • 这是一个树形图
  • 键是范围的下半部分
  • 该值是一个
    AbstractMap.SimpleEntry
    ,包含范围的上部和字符串
测试

int[] testData = { 9, 23, 255, 99, 94, 201 };
for (int i : testData) {
    System.out.printf("%4d -> %s%n",i, get.apply(i));
}
    
印刷品

   9 -> Not Found
  23 -> A
 255 -> B
  99 -> A
  94 -> Not Found
 201 -> A

您可以使用
TreeMap
Entry
来完成它,就像使用常规Java一样。 如果提供的参数不存在范围,则返回
notfound

这是包含范围的地图

  • 这是一个树形图
  • 键是范围的下半部分
  • 该值是一个
    AbstractMap.SimpleEntry
    ,包含范围的上部和字符串
测试

int[] testData = { 9, 23, 255, 99, 94, 201 };
for (int i : testData) {
    System.out.printf("%4d -> %s%n",i, get.apply(i));
}
    
印刷品

   9 -> Not Found
  23 -> A
 255 -> B
  99 -> A
  94 -> Not Found
 201 -> A

看看这里使用的树结构。如果我读对了,即使只有六个
If
s检查一个数字是否在某个范围内也比使用地图更有效。也许不优雅,但肯定很有效。如果范围列表很小,我会使用
if
。我的列表是以百为单位的。:(看看这里使用的树形结构。如果我读对了,即使只有六个
If
s检查一个数字是否在某个范围内也比使用地图更有效。可能不优雅,但肯定有效。如果范围列表很小,我会使用
If
。我的列表是以百为单位的。)(谢谢。我的实际范围列表是数百个。这可能不是我案例的优雅解决方案/谢谢。我的实际范围列表是数百个。这可能不是我案例的优雅解决方案/谢谢。感谢您的帮助。对于Java中相对简单的操作,我质疑使用第三方库只是为了获得此功能(当然,除非OP已经在使用Guava)。谢谢。感谢您的帮助。对于Java中相对简单的操作,我质疑使用第三方库只是为了获得此功能(当然,除非OP已经在使用Guava)。
   9 -> Not Found
  23 -> A
 255 -> B
  99 -> A
  94 -> Not Found
 201 -> A