考虑整数列表<1,5,10>
(假设按升序排序)。
给定一个整数,比如key = 6
,是否有一个实用程序方法返回key
之后的最小元素(在这种情况下它将是10)?
注意:循环遍历列表中的元素并将其与key
进行比较是一种显而易见的方法,但我只是想知道是否存在一种实用方法来执行相同的操作:)
答案 0 :(得分:6)
您考虑过Binary Search了吗? Collections有一个你可以使用的binarySearch方法。
来自Collections binarySearch文档:
返回:
搜索键的索引,如果 它包含在列表中; 否则,( - (插入点) - 1)。 插入点定义为 密钥的位置 插入列表:索引 第一个元素大于 key,或list.size(),如果是所有元素 在列表中小于 指定的密钥。请注意这一点 保证返回值 当且仅当密钥是时,be> = 0 找到。
我会告诉你如何使用Collections.binarySearch的返回值来获得你需要的答案。
答案 1 :(得分:3)
二进制搜索有效,但如果事实上你有一组有序的值,那么SortedSet
(或者更好的NavigableSet
)代替List
,是最多的自然数据结构的选择。
以下是一个示例用法:
NavigableSet<Integer> nums = new TreeSet<Integer>(
Arrays.asList(9,1,5,7,3)
);
System.out.println(nums); // "[1, 3, 5, 7, 9]"
System.out.println(nums.first()); // "1"
System.out.println(nums.last()); // "9"
System.out.println(nums.higher(3)); // "5"
System.out.println(nums.lower(8)); // "7"
System.out.println(nums.subSet(2,8)); // "[3, 5, 7]"
System.out.println(nums.subSet(1, true, 5, true)); // "[1, 3, 5]"
还有NavigableMap
对应物在某些情况下可能更有用。