考虑整数列表<1,5,10>
(假设按升序方式排序)。在某个值后搜索列表中的最小元素
给定一个整数,比如key = 6
,是否有一个实用方法返回key
(在这种情况下,它将是10)后的最小元素?
注:通过在列表中的元素循环,并将其与key
比较是做一个明显的方式,但如果存在一个实用方法做同样的事情:)
考虑整数列表<1,5,10>
(假设按升序方式排序)。在某个值后搜索列表中的最小元素
给定一个整数,比如key = 6
,是否有一个实用方法返回key
(在这种情况下,它将是10)后的最小元素?
注:通过在列表中的元素循环,并将其与key
比较是做一个明显的方式,但如果存在一个实用方法做同样的事情:)
二进制搜索的工作,但如果事实上你有一个排序的设定值,则代替List
,一个SortedSet
(甚至更好NavigableSet
),是首选的最自然的数据结构。
下面是一个例子用法:
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
对手说,甚至可以在某些情况下更加有用。
有我只是想知道你认为是Binary Search? Collections有一个您可以使用的binarySearch方法。
从收藏的binarySearch文档:
返回:
搜索键的索引,如果 它包含在列表中;否则,( - (插入点)-1)。 插入点被定义为 点处的关键将是 插入列表:的 第一个元素比 键,则为list.size()更大的索引,如果列表中的所有元素是 小于指定密钥 。请注意,当且仅当找到密钥 时,此 保证返回值将为 > = 0。
我会让你弄清楚如何使用Collections.binarySearch的返回值来获得你需要的答案。
二进制搜索仅搜索列表中的确切值,不是?在上面发布的示例中,由于6不在列表中,因此二分查找将返回“未找到”值。 – ryanprayogo 2010-07-13 16:36:21
@ryan:不,二进制搜索还可以确切地告诉你列表中它不得不去的地方,如果它不在那里。查看编辑到答案中的binarySearch的文档。 – 2010-07-13 16:37:23
完美。正是我需要的。 – ryanprayogo 2010-07-13 16:47:56