From 854f1d064da9311f0d2ae5285fba241ba9c4d0dd Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 6 May 2023 02:41:53 +0800 Subject: [PATCH] fix code --- .../core/lang/selector/IncrementSelector.java | 59 +++++++++++++++++++ .../core/lang/selector/RandomSelector.java | 55 +++++++++++++++++ .../hutool/core/lang/selector/Selector.java | 2 +- .../lang/selector/SmoothWeightSelector.java | 2 +- .../lang/selector/WeightRandomSelector.java | 2 +- .../selector/SmoothWeightSelectorTest.java | 53 +++++++++++++++++ .../selector/WeightRandomSelectorTest.java | 26 +++++++- 7 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/IncrementSelector.java create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/RandomSelector.java create mode 100644 hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelectorTest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/IncrementSelector.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/IncrementSelector.java new file mode 100644 index 000000000..aa01698a6 --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/IncrementSelector.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.lang.selector; + +import java.util.ArrayList; + +/** + * 简单的轮询选择器 + * + * @param 元素类型 + * @author Looly + * @since 6.0.0 + */ +public class IncrementSelector extends ArrayList implements Selector { + private static final long serialVersionUID = 1L; + + private int position; + + // region ----- Constructors + + /** + * 构造 + */ + public IncrementSelector() { + super(); + } + + /** + * 构造 + * + * @param objList 对象列表 + */ + public IncrementSelector(final Iterable objList) { + this(); + for (final T obj : objList) { + add(obj); + } + } + // endregion + + @Override + public T select() { + final T result = get(position); + if(position >= size()){ + position = 0; + } + return result; + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/RandomSelector.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/RandomSelector.java new file mode 100644 index 000000000..284d9d376 --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/RandomSelector.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.lang.selector; + +import org.dromara.hutool.core.util.RandomUtil; + +import java.util.ArrayList; + +/** + * 随机选择器 + * + * @param 元素类型 + * @author Looly + * @since 6.0.0 + */ +public class RandomSelector extends ArrayList implements Selector { + private static final long serialVersionUID = 1L; + + // region ----- Constructors + + /** + * 构造 + */ + public RandomSelector() { + super(); + } + + /** + * 构造 + * + * @param objList 对象列表 + */ + public RandomSelector(final Iterable objList) { + this(); + for (final T obj : objList) { + add(obj); + } + } + // endregion + + @Override + public T select() { + return get(RandomUtil.randomInt(0, size())); + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/Selector.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/Selector.java index 295e2871c..da9e4e54c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/Selector.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/Selector.java @@ -26,5 +26,5 @@ public interface Selector { * * @return 下一个对象 */ - T next(); + T select(); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelector.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelector.java index bb7933341..55b06b450 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelector.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelector.java @@ -121,7 +121,7 @@ public class SmoothWeightSelector implements Selector { * @return 选中的对象 */ @Override - public T next() { + public T select() { if (CollUtil.isEmpty(this.objList)) { return null; } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/WeightRandomSelector.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/WeightRandomSelector.java index 215918b00..981e747e2 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/WeightRandomSelector.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/selector/WeightRandomSelector.java @@ -145,7 +145,7 @@ public class WeightRandomSelector implements Selector, Serializable { * @return 随机对象 */ @Override - public T next() { + public T select() { final int randomWeight = (int) (this.weightMap.lastKey() * Math.random()); final SortedMap tailMap = this.weightMap.tailMap(randomWeight, false); return this.weightMap.get(tailMap.firstKey()); diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelectorTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelectorTest.java new file mode 100644 index 000000000..e6ab3a1b2 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/SmoothWeightSelectorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.lang.selector; + +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.collection.ListUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SmoothWeightSelectorTest { + @Test + public void selectTest() { + final SmoothWeightSelector selector = SmoothWeightSelector.of(); + selector.add("A", 10); + selector.add("B", 50); + selector.add("C", 100); + + final String result = selector.select(); + Assertions.assertTrue(ListUtil.of("A", "B", "C").contains(result)); + } + + @Test + public void selectCountTest() { + final SmoothWeightSelector selector = SmoothWeightSelector.of(); + selector.add("A", 10); + selector.add("B", 50); + selector.add("C", 100); + + final List resultList = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + resultList.add(selector.select()); + } + + final Map countMap = CollUtil.countMap(resultList); + Assertions.assertEquals(63, countMap.get("A")); + Assertions.assertEquals(312, countMap.get("B")); + Assertions.assertEquals(625, countMap.get("C")); + } +} diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/WeightRandomSelectorTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/WeightRandomSelectorTest.java index 3ad880540..d722fb8de 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/WeightRandomSelectorTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/lang/selector/WeightRandomSelectorTest.java @@ -12,20 +12,42 @@ package org.dromara.hutool.core.lang.selector; +import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.ListUtil; +import org.dromara.hutool.core.lang.Console; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + public class WeightRandomSelectorTest { @Test - public void weightRandomTest() { + public void selectTest() { final WeightRandomSelector random = WeightRandomSelector.of(); random.add("A", 10); random.add("B", 50); random.add("C", 100); - final String result = random.next(); + final String result = random.select(); Assertions.assertTrue(ListUtil.of("A", "B", "C").contains(result)); } + + @Test + @Disabled + public void selectCountTest() { + final WeightRandomSelector random = WeightRandomSelector.of(); + random.add("A", 10); + random.add("B", 50); + random.add("C", 100); + + final List resultList = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + resultList.add(random.select()); + } + + Console.log(CollUtil.countMap(resultList)); + } }