我有名单。这将返回Web服务响应的一部分。如果列表中的所有值都为零,我想清除列表。
我已经用下面的代码来实现。但我正在寻找更好的解决方案。
i=0;
for (int element : myList) {
if (element != 0)
break;
else
i++;
}
if (myList.size()==i)
myList.clear();
答案 0 :(得分:2)
您可以将计数反转以使其更简单
int zero_elements = 0;
for (int element : myList) {
if (element == 0) zero_elements++;
}
if (myList.size() == zero_elements) myList.clear();
更进一步,您可以像这样使用Collections.frequency()
if (Collections.frequency(myList, 0) == myList.size())
myList.clear();
如果您愿意添加库和Java 8,第三种选择就是使用Guava这样
if (Iterables.all(myList, (int element) -> element == 0))
myList.clear();
答案 1 :(得分:1)
您可以删除重复的值,然后只需检查列表中是否只包含1个值,等于0:
Set<Integer> noDuplicates = new HashSet<Integer>(myList);
if (noDuplicates.size() == 1 && noDuplicates.iterator().next() == 0) {
myList.clear();
}
答案 2 :(得分:1)
如果您没有使用Lambdas,那么您可以使用Collections#frequency类,获取列表中零元素的频率,如果频率与列表大小相同,那么您可以清除它...
public static void main(String[] args) {
List<Integer> myList = new ArrayList<>();
myList.add(0);
myList.add(0);
myList.add(0);
myList.add(0);
myList.add(0);
// 5 elements all zeros
int occurrences = Collections.frequency(myList, 0);
if (occurrences == myList.size()) {
myList.clear();
}
//
// using Lambdas:
boolean areAllZero = myList.parallelStream().allMatch(i -> i == 0);
if (areAllZero) {
myList.clear();
}
}
答案 3 :(得分:1)
我会选择:
private void clearIfContainsOnlyZeros(List<Integer> list){
for(int value:list){
if (value !=0){
return;
}
}
list.clear();
}
答案 4 :(得分:1)
您可以使用Java 8 Streams API ...
if (myList.stream().filter(i -> i != 0).count() == 0) {
myList.clear();
}
检查任何非零值并获取计数。如果非零值的计数为零,则它们都必须为零。因此,清除清单。
或者,更好的 ......
if (myList.stream().allMatch(i -> i == 0)) {
myList.clear();
}
另外......(给出k5 _&#39;以下评论)......
if (!myList.stream().filter(i -> i != 0).findFirst().isPresent()) {
myList.clear();
}
答案 5 :(得分:0)
我有一个建议,但我不认为这是一个明智的方法,但你可以尝试一下。 您可以拥有一个初始化为某个值的标志,每次清除列表以及每次向列表中添加或删除项目时,都会根据项目的值相应地更改标志值。
例如,您可以拥有一个变量flag
,其值最初为0.当您将项目插入列表时,(您必须编写一个单独的块,可能是一个方法,以插入将项目放入列表以检查项目的值并对标志进行更改)检查项目的值,如果值为0,则flag
将更改为1。您可以避免上述循环来清除列表。