BinarySearchUtil.java 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package com.smppw.analysis.infrastructure.utils;
  2. import java.util.List;
  3. import java.util.Objects;
  4. public class BinarySearchUtil {
  5. /**
  6. *
  7. * @param dateList 从小到大的净值序列
  8. * @param date 日期
  9. * @return 小于等于 date 的 日期最大的净值
  10. */
  11. public static Integer getMostLeftLessNav(List<String> dateList, String date) {
  12. if (dateList == null || dateList.size() == 0) {
  13. return 0;
  14. }
  15. int L = 0;
  16. int R = dateList.size() - 1;
  17. int ans = -1;
  18. while (L <= R) {
  19. int mid = (L + R) / 2;
  20. if (dateList.get(mid) !=null && dateList.get(mid).compareTo(date) <= 0) {
  21. ans = mid;
  22. L = mid + 1;
  23. } else {
  24. R = mid - 1;
  25. }
  26. }
  27. return ans == -1 ? 0 : ans;
  28. }
  29. /**
  30. *
  31. * @param dateList 从小到大的净值序列
  32. * @param date 日期
  33. * @return 小于 date 的 日期最大的净值
  34. */
  35. public static Integer getMostLeftLessNotEqualsNav(List<String> dateList, String date) {
  36. if (dateList == null || dateList.size() == 0) {
  37. return 0;
  38. }
  39. int L = 0;
  40. int R = dateList.size() - 1;
  41. int ans = -1;
  42. while (L <= R) {
  43. int mid = (L + R) / 2;
  44. if (dateList.get(mid) !=null && dateList.get(mid).compareTo(date) < 0) {
  45. ans = mid;
  46. L = mid + 1;
  47. } else {
  48. R = mid - 1;
  49. }
  50. }
  51. return ans == -1 ? 0 : ans;
  52. }
  53. /**
  54. *
  55. * @param dateList 从小到大的净值序列
  56. * @param date 日期
  57. * @return 大于等于 date 的 日期最小的净值
  58. */
  59. public static Integer getMostRightThanNav(List<String> dateList, String date) {
  60. if(dateList == null && Objects.requireNonNull(dateList).size() == 0){
  61. return -1;
  62. }else if(dateList.get(dateList.size()-1).compareTo(date) < 0){
  63. return dateList.size() - 1;
  64. }
  65. int low = 0;
  66. int high = dateList.size() - 1;
  67. while(low < high){
  68. //防止溢出
  69. int mid = low + (high-low)/2;
  70. if(dateList.get(mid).compareTo(date) < 0){
  71. low = mid + 1;
  72. }else{
  73. high = mid;
  74. }
  75. }
  76. return low;
  77. }
  78. }