2010-07-13 75 views
1

考虑整数列表<1,5,10>(假设按升序方式排序)。在某个值后搜索列表中的最小元素

给定一个整数,比如key = 6,是否有一个实用方法返回key(在这种情况下,它将是10)后的最小元素?

注:通过在列表中的元素循环,并将其与key比较是做一个明显的方式,但如果存在一个实用方法做同样的事情:)

回答

3

二进制搜索的工作,但如果事实上你有一个排序的设定值,则代替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对手说,甚至可以在某些情况下更加有用。

6

有我只是想知道你认为是Binary SearchCollections有一个您可以使用的binarySearch方法。

从收藏的binarySearch文档:

返回:

搜索键的索引,如果 它包含在列表中;否则,( - (插入点)-1)。 插入点被定义为 点处的关键将是 插入列表:的 第一个元素比 键,则为list.size()更大的索引,如果列表中的所有元素是 小于指定密钥 。请注意,当且仅当找到密钥 时,此 保证返回值将为 > = 0。

我会让你弄清楚如何使用Collections.binarySearch的返回值来获得你需要的答案。

+0

二进制搜索仅搜索列表中的确切值,不是?在上面发布的示例中,由于6不在列表中,因此二分查找将返回“未找到”值。 – ryanprayogo 2010-07-13 16:36:21

+3

@ryan:不,二进制搜索还可以确切地告诉你列表中它不得不去的地方,如果它不在那里。查看编辑到答案中的binarySearch的文档。 – 2010-07-13 16:37:23

+0

完美。正是我需要的。 – ryanprayogo 2010-07-13 16:47:56