From 9065fabf137dda0d111b1b4cdb3a4d95148c06e1 Mon Sep 17 00:00:00 2001 From: bynt Date: Mon, 20 Dec 2021 10:20:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E9=85=8D=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/baiye/service/AssignDataService.java | 24 +++++++++++++------ .../baiye/service/WeightRandomStrategyX.java | 4 ++-- .../src/test/java/com/baiye/SettingTest.java | 22 +++++++++++++---- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/services/ad-platform-service/src/main/java/com/baiye/service/AssignDataService.java b/services/ad-platform-service/src/main/java/com/baiye/service/AssignDataService.java index c6f58c07..cde0dc85 100644 --- a/services/ad-platform-service/src/main/java/com/baiye/service/AssignDataService.java +++ b/services/ad-platform-service/src/main/java/com/baiye/service/AssignDataService.java @@ -1,5 +1,6 @@ package com.baiye.service; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.NumberUtil; import com.baiye.constant.DefaultNumberConstants; import com.baiye.http.CommonResponse; @@ -14,7 +15,9 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; /** * @author Enzo @@ -41,21 +44,28 @@ public class AssignDataService { if (sum != DefaultNumberConstants.ONE_HUNDRED) { return CommonResponse.createByErrorMessage(ResponseCode.DECRYPTION_FAILED.getDesc()); } + // 进行排序保证最大比例在后 + Map deptMap = + deptIds.stream().collect(Collectors.toMap(key -> key, key -> weights.get(deptIds.indexOf(key)))); + Map longDoubleMap = MapUtil.sortByValue(deptMap, Boolean.FALSE); CopyOnWriteArrayList value; List list = new ArrayList<>(); DistributeResponseDTO distributeResponseDTO; - for (int i = DefaultNumberConstants.ZERO_NUMBER; i < deptIds.size(); i++) { - Double aDouble = weights.get(i); + int num = DefaultNumberConstants.ZERO_NUMBER; + for (Map.Entry longDoubleEntry : longDoubleMap.entrySet()) { + Long key = longDoubleEntry.getKey(); + Double aDouble = longDoubleEntry.getValue(); distributeResponseDTO = new DistributeResponseDTO(); - if (size - DefaultNumberConstants.ONE_NUMBER > i) { + if (size - DefaultNumberConstants.ONE_NUMBER > num) { + num++; double div = NumberUtil.div(aDouble, Double.valueOf(DefaultNumberConstants.ONE_HUNDRED), DefaultNumberConstants.TWO_HUNDRED); int count = (int) Math.floor(NumberUtil.mul(resourceSize, div)); if (count == DefaultNumberConstants.ONE_NUMBER) { - int middle = (int) Math.floor(copyOnWriteArrayList.size() / 2); + int middle = copyOnWriteArrayList.size() / DefaultNumberConstants.TWO_NUMBER; value = Lists.newCopyOnWriteArrayList(Lists.newArrayList(copyOnWriteArrayList.get(middle))); distributeResponseDTO.setResponseList(value); - distributeResponseDTO.setDeptId(deptIds.get(i)); + distributeResponseDTO.setDeptId(key); list.add(distributeResponseDTO); copyOnWriteArrayList.remove(middle); continue; @@ -63,13 +73,13 @@ public class AssignDataService { value = Lists.newCopyOnWriteArrayList (copyOnWriteArrayList.subList(DefaultNumberConstants.ZERO_NUMBER, count)); distributeResponseDTO.setResponseList(value); - distributeResponseDTO.setDeptId(deptIds.get(i)); + distributeResponseDTO.setDeptId(key); list.add(distributeResponseDTO); copyOnWriteArrayList.removeAll(value); } else { value = Lists.newCopyOnWriteArrayList(Lists.newArrayList(copyOnWriteArrayList)); distributeResponseDTO.setResponseList(value); - distributeResponseDTO.setDeptId(deptIds.get(i)); + distributeResponseDTO.setDeptId(longDoubleEntry.getKey()); list.add(distributeResponseDTO); } } diff --git a/services/ad-platform-service/src/main/java/com/baiye/service/WeightRandomStrategyX.java b/services/ad-platform-service/src/main/java/com/baiye/service/WeightRandomStrategyX.java index d51a25bd..55744333 100644 --- a/services/ad-platform-service/src/main/java/com/baiye/service/WeightRandomStrategyX.java +++ b/services/ad-platform-service/src/main/java/com/baiye/service/WeightRandomStrategyX.java @@ -22,8 +22,8 @@ public class WeightRandomStrategyX { private double factor=0D; public WeightRandomStrategyX(List> list) { for (Pair pair : list) { - this.weightMap.put(factor, pair.getKey()); - this.factor+=pair.getValue().doubleValue(); + double lastWeight = this.weightMap.size() == 0 ? 0 : this.weightMap.lastKey(); + this.weightMap.put(pair.getValue().doubleValue() + lastWeight, pair.getKey()); } } diff --git a/services/ad-platform-service/src/test/java/com/baiye/SettingTest.java b/services/ad-platform-service/src/test/java/com/baiye/SettingTest.java index 37b4ae61..2f71238d 100644 --- a/services/ad-platform-service/src/test/java/com/baiye/SettingTest.java +++ b/services/ad-platform-service/src/test/java/com/baiye/SettingTest.java @@ -1,5 +1,6 @@ package com.baiye; +import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; import com.baiye.model.dto.DistributeDTO; import com.baiye.service.AssignDataService; @@ -11,9 +12,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * @author Enzo @@ -36,7 +36,7 @@ public class SettingTest { List strings = Lists.newArrayList("a", "b", "c", "d","e","f","g","h","i","j"); List longs = Lists.newArrayList(12360L, 12361L,12362L,12363L,12364L,12365L); - List doubleList = Lists.newArrayList(16.66, 16.66,16.66,16.66,16.66,16.7); + List doubleList = Lists.newArrayList(40.0, 20.0,10.0,15.0,10.0,5.0); distributeDTO.setResourceList(strings); distributeDTO.setWeights(doubleList); distributeDTO.setDeptIds(longs); @@ -45,6 +45,8 @@ public class SettingTest { } + + public static List> fixedGrouping2(List source, int n) { if (null == source || source.size() == 0 || n <= 0) @@ -169,4 +171,14 @@ public class SettingTest { } -} \ No newline at end of file + + @Test + public void sortMap(){ + List doubles = Lists.newArrayList(123.00, 122.00); + List longs = Lists.newArrayList(12362L,12361L); + Map collect = longs.stream().collect(Collectors.toMap(key -> key, key -> doubles.get(longs.indexOf(key)))); + + TreeMap sort = MapUtil.sort(collect); + + } +}