作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个命令:
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/
我是一名优秀的程序员,十分优秀!