ExtractorUtils.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package examples.extractor;
  2. import java.util.Map;
  3. import java.time.LocalDateTime;
  4. import java.time.format.DateTimeFormatter;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class ExtractorUtils {
  8. public static Double division(String s1, String s2, Map<String, String> maps){
  9. double rate = 0.0;
  10. if (maps.containsKey(s1) && maps.containsKey(s2)){
  11. Double d1 = Double.valueOf(maps.get(s1));
  12. if (isDoubleEqualToZero(d1)){
  13. return rate;
  14. }
  15. Double d2 = Double.valueOf(maps.get(s2));
  16. rate = d2 / d1;
  17. }
  18. return rate;
  19. }
  20. public static Double divisionDouble(Double d1, Double d2){
  21. double rate = 0.0;
  22. if (isDoubleEqualToZero(d1)){
  23. return rate;
  24. }
  25. rate = d2 / d1;
  26. return rate;
  27. }
  28. public static boolean isDoubleEqualToZero(double value) {
  29. final double epsilon = 1e-10; // 定义一个很小的误差范围
  30. // 判断value是否在误差范围内
  31. return Math.abs(value) < epsilon;
  32. }
  33. public static double calculateVariance(List<Double> numbers) {
  34. double average = numbers.stream()
  35. .mapToDouble(Double::doubleValue)
  36. .average()
  37. .orElse(0.0);
  38. double squaredDiffSum = numbers.stream()
  39. .mapToDouble(Double::doubleValue)
  40. .map(x -> Math.pow(x - average, 2))
  41. .average()
  42. .orElse(0.0);
  43. return squaredDiffSum;
  44. }
  45. public static double calculateAverage(List<Double> numbers) {
  46. if (numbers == null || numbers.isEmpty()) {
  47. return 0.0;
  48. }
  49. return numbers.stream()
  50. .mapToDouble(Number::doubleValue)
  51. .average()
  52. .orElse(0.0);
  53. }
  54. public static List<Double> calculateDifferences(List<Double> numbers) {
  55. List<Double> differences = new ArrayList<>();
  56. for (int i = 0; i < numbers.size() - 1; i++) {
  57. Double diff = 0.0;
  58. if (!isDoubleEqualToZero(numbers.get(i))){
  59. diff = (numbers.get(i + 1) - numbers.get(i)) / numbers.get(i);
  60. }
  61. differences.add(diff);
  62. }
  63. return differences;
  64. }
  65. public static List<String> generateHourStrings(String timeString, int N) {
  66. LocalDateTime dateTime = LocalDateTime.parse(timeString, DateTimeFormatter.ofPattern("yyyyMMddHH"));
  67. List<String> hourStrings = new ArrayList<>();
  68. for (int i = 0; i < N; i++) {
  69. hourStrings.add(dateTime.minusHours(i).format(DateTimeFormatter.ofPattern("yyyyMMddHH")));
  70. }
  71. return hourStrings;
  72. }
  73. public static String subtractHours(String inputDateTime, int hoursToSubtract) {
  74. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHH");
  75. LocalDateTime dateTime = LocalDateTime.parse(inputDateTime, formatter);
  76. LocalDateTime subtractedDateTime = dateTime.minusHours(hoursToSubtract);
  77. return subtractedDateTime.format(formatter);
  78. }
  79. // 针对0-1的数字,进行分桶。
  80. public static Integer ceilLogRate(Double key) {
  81. double bucket = Math.ceil(
  82. Math.pow(key, 0.2) * 100
  83. );
  84. if (bucket > 300) {
  85. bucket = 300;
  86. }
  87. if (bucket < 0) {
  88. bucket = 0;
  89. }
  90. return (int)bucket;
  91. }
  92. // 针对大于1的数字,进行分桶。
  93. public static int bucketCnt(Double key) {
  94. long bucket = Math.round(Math.log((key * 10 + 1.0)) * 10);
  95. if (bucket > 300) {
  96. bucket = 300;
  97. }
  98. if (bucket < 0) {
  99. bucket = 0;
  100. }
  101. return (int)bucket;
  102. }
  103. public static int findInsertPosition(double[] sortedArray, double target) {
  104. int low = 0;
  105. int high = sortedArray.length - 1;
  106. while (low <= high) {
  107. int mid = low + (high - low) / 2;
  108. double midValue = sortedArray[mid];
  109. if (midValue < target) {
  110. low = mid + 1;
  111. } else if (midValue > target) {
  112. high = mid - 1;
  113. } else {
  114. // 找到相等的值,尝试在右侧寻找插入点
  115. while (mid < sortedArray.length - 1 && sortedArray[mid + 1] == target) {
  116. mid++;
  117. }
  118. return mid + 1; // 返回当前mid的下一个位置作为插入点
  119. }
  120. }
  121. return low; // 返回low作为插入点
  122. }
  123. public static void main(String[] args) {
  124. double[] sortedArray = {1.0, 2.0, 4.0, 4.0, 6.0};
  125. double target = 0.0;
  126. System.out.println(findInsertPosition(sortedArray, target));
  127. // System.out.println(ceilLogRate(0.0002));
  128. // System.out.println(ceilLogRate(0.01));
  129. // System.out.println(ceilLogRate(0.2));
  130. // System.out.println(ceilLogRate(4.));
  131. // System.out.println(bucketCnt(1.));
  132. // System.out.println(bucketCnt(20.));
  133. // System.out.println(bucketCnt(500.));
  134. // System.out.println(bucketCnt(50000.));
  135. // System.out.println(generateHourStrings("2024011603", 5));
  136. }
  137. }