如何優雅地判斷 N 個布爾值是否全部相等?

如何判斷 N 個布爾值是否全等,N 大於等於 2。

語言:JavaScript,java

------------------------ 分割線 -----------------------

2016.11.28

return arr.indexOf(!arr[0])&<0;

還是 Milo Yip 的方法精簡,謝謝!使用了 ES5 中的 Array.prototype.indexOf() 方法,兼容 IE9 +

順便扒了一下 indexOf 的實現源碼,實現機制是:遍歷(while) + 強等於判斷(===),有興趣的可以看一下(Array.prototype.indexOf())。

------------------------ 分割線 -----------------------

2016.11.24

參考 Jon Lee 的第一個,想到個類似的:

var arr1 = [true, true, true, true],
arr2 = [true, true, false, true],
arr3 = [false, false, false, false];

var str1 = arr1.toString(), // "true,true,true,true"
str2 = arr2.toString(); // "true,true,false,true"
str3 = arr3.toString(); // "false,false,false,false"

console.log( str1.indexOf("true"), str1.indexOf("false") ); // 0 -1
console.log( str2.indexOf("true"), str2.indexOf("false") ); // 0 10
console.log( str3.indexOf("true"), str3.indexOf("false") ); // -1 0

function isAllBoolEqual( arr ) {
var str = "",
trueIndex = 0,
falseIndex = 0;

str = arr.toString();
trueIndex = str.indexOf( "true" );
falseIndex = str.indexOf( "false" );

return !(trueIndex &>= 0 falseIndex &>= 0);
}

console.log( isAllBoolEqual(arr1) ); // true
console.log( isAllBoolEqual(arr2) ); // false
console.log( isAllBoolEqual(arr3) ); // true


return arr.indexOf(!arr[0])&<0;

----

更新:沒想到有這麼多贊,在 知乎專欄 解釋一下。


arr.every(b =&> b === arr[0]);

這個方法的優點就是語義與問題一致。另外可以處理數組為空的情況,空數組內沒有不相等的布爾值,因此也應該返回true。


假裝比 @Milo Yip 菊苣更短:

return !arr.includes(!arr[0])


return new Set(l).size === 1;

return new HashSet&<&>(l).size() == 1;


題主想要怎麼個優雅?

一行(慢):

return array.min() == array.max();

兩行(居中):

long n = array.count(true);
return n == array.size() || n == 0;

三行(平均快):

return adjacent_find(array.begin(), array.end()
[](bool lhs, bool rhs)
{ return lhs != rhs; }) == array.end();


前段時間項目里正好有這個需求要用…上一下自己的代碼

Java 運行環境JDK8

boolean a = true;
boolean b = true;
boolean c = true;
boolean d = true;
boolean e = true;
boolean f = true;
boolean g = true;
boolean h = false;

System.out.println(Stream.of(a,b,c,d,e,f,g).collect(Collectors.toSet()).size() == 1); // true

System.out.println(Stream.of(a,b,c,d,e,f,g,h).collect(Collectors.toSet()).size() == 1); // false


python版的

return len(set(a)) == 1


放棄用bool改用bit。。

bitmap==0||!(bitmap&<&<(32-N))&>&>(32-N)==0


只是看上去優雅,實際上還是遍歷O(n)


vec == |vec

如果vec全0,那麼得到0==0,表達式為真;

如果vec全1,那麼得到1==1,表達式為真;

如果vec有0有1,那麼得到0==1,表達式為假。

另解(比較容易實現,但沒有上面那個優雅):

sum = SUM(vec)

return sum == 0 || sum == len(vec)


能否用bit位來存?直接判斷整個int是否=0


強行來個Python版的:

all(array) or not any(array)


強行lua一發,一點也不優雅,甚至有些臟:

return pcall(table.sort,arr,function(a,b) return a~=b and error() or false end)


來一個強行python版~

return sum(mylist) % len(mylist) == 0

解釋就是,求和時True為1,False為0,所以全部為false時sum為零,全部為True時sum等於list長度,只有在這兩種情況下sum除以len才能餘數為0。如果list中有true有false,那得到的數肯定大於零、小於list長度。


推薦閱讀:

大學計算機專業翹掉所有課自學可以嗎?
大家都說寫代碼的吃的是青春飯,那麼那些學計算機的是不是40歲以後沒事幹了?
一個無限不循環數,如圓周率,假設我取它的足夠多位,那麼它以後無論接著取多少位,它的每個數字出現的頻率?
計算機專業的學生怎麼通過Upwork來賺錢?
《深入理解計算機系統》這本書需要什麼水平能看懂?

TAG:JavaScript | 演算法 | 計算機 | 演算法與數據結構 |