Java 通過位運(yùn)算求一個集合的所有子集方法
Java沒有自帶的求一個集合的所有子集的方法,我們可以通過集合的子集規(guī)律來求。
一個集合的所有子集等于2^該集合的長度。比如{c,b,a}的長度為3,這個集合的子集就有8個。
這句話看起來很簡單,但同時(shí)也隱含著高深的哲理。其實(shí)一個集合的所有集合,和2^該集合的長度這個數(shù)字有關(guān)。比如上面的例子,{c,b,a}的長度為3,則可以用0-7表示其所有子集。如下所示,改數(shù)字所對應(yīng)的位置為1,則說明我需要這個數(shù)字形成子集。從0-7的二進(jìn)制表示,剛好代表完,一個長度為3,子集個數(shù)為8的所有子集。
0(000):{}
1(001):{a}
2(010):
3(011):{ab}
4(100):{c}
5(101):{a,c}
6(110):{b,c}
7(111):{a,b,c}
于是,根據(jù)上面的規(guī)律,代碼可以這樣寫,先取集合長度,求出2^該集合的長度是多少,比如上面的8,然后從0遍歷到8-1。遍歷的時(shí)候,對0、1、2……每一個數(shù)據(jù)進(jìn)行位運(yùn)算,逐一判斷其對應(yīng)的位數(shù),也就是二進(jìn)制表示方式,那一位是1。用匯編那種,將每一位移到最末尾,與1的位與實(shí)現(xiàn),具體代碼如下:
import java.util.ArrayList;
public class getSubSet {
public static ArrayList<ArrayList<Integer>> getSubset(ArrayList<Integer> L) {
if (L.size() > 0) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < Math.pow(2, L.size()); i++) {// 集合子集個數(shù)=2的該集合長度的乘方
ArrayList<Integer> subSet = new ArrayList<Integer>();
int index = i;// 索引從0一直到2的集合長度的乘方-1
for (int j = 0; j < L.size(); j++) {
// 通過逐一位移,判斷索引那一位是1,如果是,再添加此項(xiàng)
if ((index & 1) == 1) {// 位與運(yùn)算,判斷最后一位是否為1
subSet.add(L.get(j));
}
index >>= 1;// 索引右移一位
}
result.add(subSet); // 把子集存儲起來
}
return result;
} else {
return null;
}
}
public static void main(String[] args) {
ArrayList<Integer> L = new ArrayList<Integer>();
L.add(1);
L.add(2);
L.add(3);
System.out.println(getSubset(L));
}
}
運(yùn)行結(jié)果如下:

以上這篇Java 通過位運(yùn)算求一個集合的所有子集方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot兩種配置文件properties和yml區(qū)別
這篇文章主要為大家介紹了java面試中常見問到的Spring Boot兩種配置文件properties和yml區(qū)別解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java中ArrayList在foreach里remove的問題詳析
這篇文章主要給大家介紹了關(guān)于Java中ArrayList在foreach里remove問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-09-09
關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動態(tài)sql需要注意條件
這篇文章主要介紹了關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動態(tài)sql需要注意條件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
關(guān)于Spring Bean實(shí)例過程中使用反射和遞歸處理的Bean屬性填充問題
本文帶領(lǐng)大家一起學(xué)習(xí)下在Spring Bean實(shí)例過程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補(bǔ)全屬性方法,具體操作方法跟隨小編一起學(xué)習(xí)下吧2021-06-06
基于springboot+jwt實(shí)現(xiàn)刷新token過程解析
這篇文章主要介紹了基于springboot+jwt實(shí)現(xiàn)刷新token過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

