如果我想在Java中将两个列表合并为一个,我可以使用ListUtils.union(List list1,List list2).但是,如果我想组合多个列表呢?
这有效:
import org.apache.commons.collections.ListUtils;
List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);
System.out.println(ListUtils.union(ListUtils.union(list1, list2),ListUtils.union(list3, list4)));
Run Code Online (Sandbox Code Playgroud)
但它看起来并不是最好的解决方案,阅读也不是特别好.可悲的ListUtils.union(list1,list2,list3,list4)是不行.使用addAll多次并为所有条目的副本创建自己的列表对我来说似乎并不理想.那么我该怎么做呢?
从理论上讲,界限nextGaussian是积极的和消极的无限.但是,由于Random.nextDouble用于计算高斯随机数,因此不会无限接近0和1,因此存在实际限制nextGaussian.并且Random.next也不是完全统一的分布.
理论上,最大值应该是大约2.2042*10 ^ 17并且与nextDouble(参考)的53位移位有关,但这可能只是一个上限.
答案可能取决于Random.next和的确切实施StrictMath.sqrt和分布StrictMath.log.我找不到任何关于这两者的信息.
是的,我知道外部价值极不可能,但它可能是相关的,例如在游戏中RNG操纵的背景下.
的官方文档( archive )containsAll只说“如果此列表包含指定集合的所有元素,则返回 true。”。但是,我只是测试了这个:
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(1);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(1);
list2.add(2);
System.out.println(list1.containsAll(list2));
Run Code Online (Sandbox Code Playgroud)
结果是true,即使list1不包含第二个2。
那么官方的、完全定义的行为是containsAll什么?它是否好像从两个列表中删除了所有重复项?我记得在某处读到它可能会导致重复问题,但我不知道确切的情况。
我有一个程序,基本上像这样:
boolean[] stuffNThings;
int state=1;
for(String string:list){
switch(state){
case 1:
if(/*condition*/){
// foo
break;
}else{
stuffNThings=new boolean[/*size*/];
state=2;
}
// intentional fallthrough
case 2:
// bar
stuffNThings[0]=true;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,情况2仅在先前存在状态1且在初始化数组后切换到状态2时才会发生。但是Eclipse和Java编译器看不到这一点,因为对于他们来说,逻辑看起来非常复杂。因此,Eclipse抱怨:
本地变量ststNThings可能尚未初始化。”
如果我将“ boolean[] stuffNThings;” 更改为“ boolean[] stuffNThings=null;”,则会切换到以下错误消息:
潜在的空指针访问:在此位置,变量ststNThings可能为空。
我也无法在顶部进行初始化,因为数组的大小仅在状态1的最终循环之后确定。
Java认为那里的数组可以为null,但我知道不能。有什么办法可以告诉Java吗?还是我肯定被迫对其进行无用的null检查?添加该代码会使代码更难于理解,因为看起来在某些情况下该值实际上并未设置为true。