mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-09 23:28:01 +08:00
fix code
This commit is contained in:
parent
78d4a6ee1d
commit
854f1d064d
@ -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 <T> 元素类型
|
||||||
|
* @author Looly
|
||||||
|
* @since 6.0.0
|
||||||
|
*/
|
||||||
|
public class IncrementSelector<T> extends ArrayList<T> implements Selector<T> {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private int position;
|
||||||
|
|
||||||
|
// region ----- Constructors
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*/
|
||||||
|
public IncrementSelector() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*
|
||||||
|
* @param objList 对象列表
|
||||||
|
*/
|
||||||
|
public IncrementSelector(final Iterable<T> 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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 <T> 元素类型
|
||||||
|
* @author Looly
|
||||||
|
* @since 6.0.0
|
||||||
|
*/
|
||||||
|
public class RandomSelector<T> extends ArrayList<T> implements Selector<T> {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
// region ----- Constructors
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*/
|
||||||
|
public RandomSelector() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*
|
||||||
|
* @param objList 对象列表
|
||||||
|
*/
|
||||||
|
public RandomSelector(final Iterable<T> objList) {
|
||||||
|
this();
|
||||||
|
for (final T obj : objList) {
|
||||||
|
add(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T select() {
|
||||||
|
return get(RandomUtil.randomInt(0, size()));
|
||||||
|
}
|
||||||
|
}
|
@ -26,5 +26,5 @@ public interface Selector<T> {
|
|||||||
*
|
*
|
||||||
* @return 下一个对象
|
* @return 下一个对象
|
||||||
*/
|
*/
|
||||||
T next();
|
T select();
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ public class SmoothWeightSelector<T> implements Selector<T> {
|
|||||||
* @return 选中的对象
|
* @return 选中的对象
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public T next() {
|
public T select() {
|
||||||
if (CollUtil.isEmpty(this.objList)) {
|
if (CollUtil.isEmpty(this.objList)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ public class WeightRandomSelector<T> implements Selector<T>, Serializable {
|
|||||||
* @return 随机对象
|
* @return 随机对象
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public T next() {
|
public T select() {
|
||||||
final int randomWeight = (int) (this.weightMap.lastKey() * Math.random());
|
final int randomWeight = (int) (this.weightMap.lastKey() * Math.random());
|
||||||
final SortedMap<Integer, T> tailMap = this.weightMap.tailMap(randomWeight, false);
|
final SortedMap<Integer, T> tailMap = this.weightMap.tailMap(randomWeight, false);
|
||||||
return this.weightMap.get(tailMap.firstKey());
|
return this.weightMap.get(tailMap.firstKey());
|
||||||
|
@ -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<String> 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<String> selector = SmoothWeightSelector.of();
|
||||||
|
selector.add("A", 10);
|
||||||
|
selector.add("B", 50);
|
||||||
|
selector.add("C", 100);
|
||||||
|
|
||||||
|
final List<String> resultList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
resultList.add(selector.select());
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<String, Integer> countMap = CollUtil.countMap(resultList);
|
||||||
|
Assertions.assertEquals(63, countMap.get("A"));
|
||||||
|
Assertions.assertEquals(312, countMap.get("B"));
|
||||||
|
Assertions.assertEquals(625, countMap.get("C"));
|
||||||
|
}
|
||||||
|
}
|
@ -12,20 +12,42 @@
|
|||||||
|
|
||||||
package org.dromara.hutool.core.lang.selector;
|
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.collection.ListUtil;
|
||||||
|
import org.dromara.hutool.core.lang.Console;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class WeightRandomSelectorTest {
|
public class WeightRandomSelectorTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void weightRandomTest() {
|
public void selectTest() {
|
||||||
final WeightRandomSelector<String> random = WeightRandomSelector.of();
|
final WeightRandomSelector<String> random = WeightRandomSelector.of();
|
||||||
random.add("A", 10);
|
random.add("A", 10);
|
||||||
random.add("B", 50);
|
random.add("B", 50);
|
||||||
random.add("C", 100);
|
random.add("C", 100);
|
||||||
|
|
||||||
final String result = random.next();
|
final String result = random.select();
|
||||||
Assertions.assertTrue(ListUtil.of("A", "B", "C").contains(result));
|
Assertions.assertTrue(ListUtil.of("A", "B", "C").contains(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Disabled
|
||||||
|
public void selectCountTest() {
|
||||||
|
final WeightRandomSelector<String> random = WeightRandomSelector.of();
|
||||||
|
random.add("A", 10);
|
||||||
|
random.add("B", 50);
|
||||||
|
random.add("C", 100);
|
||||||
|
|
||||||
|
final List<String> resultList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
resultList.add(random.select());
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.log(CollUtil.countMap(resultList));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user