Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果所有元素都为零,则清除列表_Java_List - Fatal编程技术网

Java 如果所有元素都为零,则清除列表

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<

我有一张单子。这将作为web服务响应的一部分返回。如果列表中的所有值都为零,我希望清除列表

我已经用下面的代码实现了。但我正在寻找更好的解决方案

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();
}