gpt4 book ai didi

java - 使用排序随机播放流 - IllegalArgumentException

转载 作者:行者123 更新时间:2023-12-02 01:57:59 25 4
gpt4 key购买 nike

我有这个命令:

list.stream()
.filter(e -> ...)
.sorted(comparatorShuffle())
.findAny()
.orElse(null);

这是comparatorShuffle():

public static <E> Comparator<E> comparatorShuffle(){

return new Comparator<>(){
private final List<Integer> temp = List.of(-1, 1);
private final Random random = new Random();
@Override
@SuppressWarnings("ComparatorMethodParameterNotUsed")
public int compare(E o1, E o2){
return temp.get(random.nextInt(temp.size()));
}
};

}

有时我会遇到异常:IllegalArgumentException:比较方法违反了其一般契约!

我明白为什么我得到这个,这是因为排序(随机)不遵守规则:if A > B && B > C then A > C

有办法抑制/忽略这个错误吗?或者另一种不使用collect来随机播放流的方法?

最佳答案

There is a way to suppress/ignore this error?

没有。

您并没有真正在这里进行洗牌,表面上您只是试图从流中选择一个随机元素。

为此,您可以将元素与随机数配对并选择最小值/最大值:

...
.map(a -> new AbstractMap.SimpleEntry<>(Math.random(), a))
.min(Map.Entry.comparingByKey())
.map(Map.Entry::getValue)
.orElse(null)

或者,您可以编写一个自定义收集器,在合并时在两个事物之间随机选择:

.collect(
Collector.of(
// Use Optional.empty() as the identity element, if the stream is empty.
Optional::empty,
// Optionalize the element, taking it randomly or if we have the identity element.
(a, b) -> a.isEmpty() || Math.random() > 0.5 ? Optional.of(b) : a,
// Merge.
(a, b) -> Math.random() > 0.5 ? b : a,
// Unwrap the value.
r -> r.orElse(null)))

这种替代方案的一个大问题是它没有从流中统一选取(您从流中获取任何一个元素的可能性并不相同),而您使用的是第一种方式。

关于java - 使用排序随机播放流 - IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69405198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com