目录
上面这篇文章中,我用【C知道】帮我解决了问题。
当时没发现问题,结果今天在使用时出现了异常。
所以,有了今天这篇内容。
目的:让逻辑更完善,方方面面都考虑到。
这次主要添加了超越边界时的处理逻辑。
/**
* 在 collection 中,找跟 value 最大接近值,且该值小于等于 value
*
* @param collection 不为null。
* @param value 不为null。
*
* @return
* 1、如果 value 小于等于 collection 中的最小值,那么直接返回 value 。
* 2、如果 value 大于等于 collection 中的最大值,那么直接返回 collection 中的最大值 。
* 3、反之,在 collection 中,找跟 value 最大接近值,且该值小于等于 value 的数。
*
*/
public static Integer findMaxNearestValue(Collection<Integer> collection,
Integer value) {
// 先排序,最小的是第一个
List<Integer> list = collection.stream().sorted().collect(Collectors.toList());
if (Integer.compare(value, list.get(0)) <= 0) {
return value;
}
///
Integer maxInCollection = list.get(list.size() - 1);
if (Integer.compare(value, maxInCollection) >= 0) {
return maxInCollection;
}
///
Integer maxNearestValue = list.get(0);
for (Integer tmpValue : collection) {
// 如果有相同值,直接返回,这是最符合要求的值
if (tmpValue.equals(value)) {
return value;
}
if (tmpValue <= value && maxNearestValue < tmpValue) {
maxNearestValue = tmpValue;
}
}
return maxNearestValue;
}
public static void main(String[] args) { List<Integer> list = Arrays.asList(2, 3, 12); / 1、超越边界 / // 1 System.out.println(findMaxNearestValue(list, 1)); // 12 System.out.println(findMaxNearestValue(list, 15)); / 2、边界值 / // 2 System.out.println(findMaxNearestValue(list, 2)); // 3 System.out.println(findMaxNearestValue(list, 3)); // 12 System.out.println(findMaxNearestValue(list, 12)); / 3、在区间内 / // 3 System.out.println(findMaxNearestValue(list, 5)); // 3 System.out.println(findMaxNearestValue(list, 9)); }