Java 如果所有元素都为零,则清除列表
我有一张单子。这将作为web服务响应的一部分返回。如果列表中的所有值都为零,我希望清除列表 我已经用下面的代码实现了。但我正在寻找更好的解决方案Java 如果所有元素都为零,则清除列表,java,list,Java,List,我有一张单子。这将作为web服务响应的一部分返回。如果列表中的所有值都为零,我希望清除列表 我已经用下面的代码实现了。但我正在寻找更好的解决方案 i=0; for (int element : myList) { if (element != 0) break; else i++; } if (myList.size()==i) myList.clear(); 您可以删除重复的值,然后只需检查列表中是否只包含1个值,即0: Set<
i=0;
for (int element : myList) {
if (element != 0)
break;
else
i++;
}
if (myList.size()==i)
myList.clear();
您可以删除重复的值,然后只需检查列表中是否只包含1个值,即0:
Set<Integer> noDuplicates = new HashSet<Integer>(myList);
if (noDuplicates.size() == 1 && noDuplicates.iterator().next() == 0) {
myList.clear();
}
Set noDuplicates=newhashset(myList);
if(noDuplicates.size()==1&&noDuplicates.iterator().next()==0){
myList.clear();
}
如果您没有使用Lambdas,那么您可以使用该类,获取列表中零元素的频率,如果频率与列表大小相同,那么您可以清除它
例子:
publicstaticvoidmain(字符串[]args){
List myList=new ArrayList();
myList.add(0);
myList.add(0);
myList.add(0);
myList.add(0);
myList.add(0);
//5个元素全部为零
int引用=Collections.frequency(myList,0);
如果(出现次数==myList.size()){
myList.clear();
}
//
//使用Lambdas:
布尔areAllZero=myList.parallelStream().allMatch(i->i==0);
如果(区域零){
myList.clear();
}
}
我有一个建议,但我认为这不是一个明智的方法,但你可以试一试。
您可以有一个初始初始化为某个值的标志,每次清除列表时,以及每当向列表中添加或从列表中删除某个项目时,该标志值都将根据该项目的值进行相应更改
例如,您可以有一个初始值为0的变量标志
。当您将项目插入列表时,(您必须编写一个单独的块,可能是一个方法,将项目插入列表,以便检查项目的值并更改标志)检查项目的值,如果值为0,则将标志更改为1。您可以避免上述循环以清除列表。我会选择:
private void clearIfContainsOnlyZeros(List<Integer> list){
for(int value:list){
if (value !=0){
return;
}
}
list.clear();
}
private void clearifcontainsonlyzero(列表){
for(int值:列表){
如果(值!=0){
返回;
}
}
list.clear();
}
您可以反转计数,使其更简单一些
int zero_elements = 0;
for (int element : myList) {
if (element == 0) zero_elements++;
}
if (myList.size() == zero_elements) myList.clear();
为了更进一步,您可以像这样使用Collections.frequency()
如果您愿意添加一个库和Java8,第三种选择是这样使用
您可以使用Java8StreamsAPI来实现此
if (myList.stream().filter(i -> i != 0).count() == 0) {
myList.clear();
}
检查任何非零值并获取计数。如果非零值的计数为零,则它们都必须为零。因此,请清除列表
或者,更好的是
if (myList.stream().allMatch(i -> i == 0)) {
myList.clear();
}
还有。。。(鉴于以下k5的评论)
我投票将这个问题作为离题题结束,因为代码评审问题应该是开着的(但先读它们)。代码评审离题了吗?那么这里的主题是什么呢?你根本不需要计数器:或者你可以用更多的开销,但可能用更少的代码来处理Java 8流(当然行数更少,但这是否真的转化为更少的代码是另一回事)。@MrSmith:.为什么投反对票?我相信这个解决方案工作得很好,而且代码是一致同意的;我就是这样做的。使用集合可能会创建列表的完整副本(如果每个项目本身都是唯一的)。即使第一项不是“0”,也始终检查完整列表。只有在“所有项目均为零”的情况下,您的方法才是合理的。还有更好的方法(即使是原来的方法也更好)。@Alex这似乎是一种非常违反直觉的方法。你也可以使用流:if(myList.parallelStream().allMatch(i->i==0))myList.clear();Collections.frequency方法似乎很有趣。我会试试看。@HariM我还添加了一个使用番石榴的例子。..findFirst().缺席()将是一个更好的检查,并避免完全扫描实际上,人们会假设allMatch
是懒惰的。allMatch也是懒惰的。我的评论是针对count版本的,它不是懒惰的。尽管它有最简洁的语法,从清晰的上下文来看,它的逻辑非常清晰,所以在效率、可维护性等方面,最适合他的目的取决于OP。
if (Iterables.all(myList, (int element) -> element == 0))
myList.clear();
if (myList.stream().filter(i -> i != 0).count() == 0) {
myList.clear();
}
if (myList.stream().allMatch(i -> i == 0)) {
myList.clear();
}
if (!myList.stream().filter(i -> i != 0).findFirst().isPresent()) {
myList.clear();
}