2016-10-20 2 views
1

У меня есть список логических значений, что является наиболее эффективным способом проверить, является ли одно из логических значений истинным, а все остальные являются ложными?Как проверить, истинно ли логическое значение из списка значений

Например, у меня есть массив из 100 булевых значений, как я могу проверить, является ли 1 boolean истинным, а все остальные логические значения являются ложными.

+1

Ровно 1? Перейдите через список и проверьте каждое значение.Остановитесь, когда вы найдете второе истинное значение. –

+0

Пожалуйста, сообщите ваш код – Venkat

+0

Вы работаете в Java 8? – smsnheck

ответ

0
int countTrue=0; 
for(boolean value: [Your List]){ 
    if(value) 
     countTrue++;  

    if(countTrue>1) 
    break; 
} 

Check countTrue==1 OR not 
+0

Это возвращает true для более чем одного истинного булева, а также –

1

Итерировать по списку и проверить каждое значение. Стоп, если вы нашли второе истинное значение:

boolean found = false; 
for (boolean b : list) { 
    if (b) { 
    if (found) return false; 
    found = true; 
    } 
} 
return found; 

В качестве альтернативы, вы можете использовать List.indexOf и List.lastIndexOf:

int indexOfFirstTrue = list.indexOf(true); 
return indexOfFirstTrue != -1 && list.lastIndexOf(true) != indexOfFirstTrue; 
+0

Итерации через большой набор значений потребуют много времени, я хочу посмотреть, есть ли простой способ. –

+0

Если вы хотите проверить только одно истинное, вы ничего не можете сделать, кроме как повторить их. –

+1

@SyameshK - форма итерации 'foreach' [лучшая производительность, которую вы получите] (https://developer.android.com/training/articles/perf-tips.html#Loops) - я не думаю, что вы может сделать это лучше. –

1

Наиболее производительный способ заключается в использовании BitSet вместо массива:

BitSet set = new BitSet(100); // ~ boolean[] array = new boolean[100]; 
set.set(42); // ~ array[42] = true; 
[...] 
int countTrueBits = set.cardinality(); 

BitSet использует операции сдвига, поэтому он очень быстрый.

Подробнее: boolean[] vs. BitSet: Which is more efficient?

+0

Есть ли какой-либо C# эквивалент? –

+0

@SyameshK Да, BitArray: https://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx – dit

+1

Возможно, это наиболее показательно, если у вас уже есть битета; но если у вас есть список (или массив), преобразование в «битсет» требует больше усилий, чем просто повторение списка (потому что он требует итерации списка, а затем выполнения других действий). –

0

Если вы работаете с Java 8 вы можете использовать это:

long size = booleanList.stream().filter(b -> Boolean.TRUE.equals(b)).count(); 
if(size == 1) { 
    // do something 
} 
0

Использование Java 8 потоков

List<Boolean> bools = list.stream().filter(val -> false) 
      .collect(Collectors.asList()); 

if (bools.size()==99) { ...} 

Вы отфильтровывать все значения, правда. если ваш список имеет 100 значений, вы получите новый список с 99 ложными значениями.

Если вы знаете, что у вас есть только 1 истинное значение в вашем списке, вы можете остановиться, когда найдете его.

list.stream().filter(val -> true) 
      .findFirst() 
      .get(); 

Он получит первый true значение, которое он встречает и возвращает его внутри Optional

+0

Это всегда повторяется по всему списку, поэтому он менее эффективен, чем обычный цикл 'for' для 99.99% случаев, когда более 1 элемента истинно, и вы могли бы закончить цикл раньше. – walen

+0

первый код да, второй нет. – svarog

+0

Второй код просто ошибочен, потому что он не проверяет более 1 истинного значения, что и требовал ОП. Если мы пытаемся узнать, существует ли только одно истинное значение, вы не можете указать «иметь только 1 истинное значение» в качестве предпосылки. – walen

1

Автор хочет знать, если только 1 значение Boolean

, как я могу проверить, если 1 булево true, и все остальные логические значения являются ложными.

в C# Я хотел бы сделать что-то вроде

Предположим

List<bool> booleanList; 

Тогда

int trueCount = booleanList.Count(b => b); 
int falseCount = booleanList.Count(b => !b); 
+0

+1, также OP заявил, что у него есть список из 100 пунктов, которые вы действительно можете просто сделать' int falseCount = 100 - trueCount ' – svarog

+0

Совершенно верно. Я просто дал ему оба варианта: он может идти в любом случае, проверяя истину или ложь :) – progrAmmar

0
int countTrue=0; 
for(boolean value: [Your List]){ 
if(value){ 
    countTrue++; 
    if(countTrue>1){ 
    // true is more than one time 
    break; 
    } 
    } 

} 
+0

вы можете остановиться после того, как найдете первое значение «истина» – svarog

+0

после второго истинного значения. поскольку наше условие не выполняется, нам не нужно перечислять весь список. –

+0

Я нарушаю цикл, как только нашел вторую истину. –

0

В C# с помощью Linq вы можете сделать это в одной строке кода

var check = itemList.Any(x => x.isActive == true);

Это вернет true, если какая-либо модель активна в списке.

Смежные вопросы