假如给定一个字符串为{1,2,3}(没有重复的元素),输出它的所有子串。例如:{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3}
代码实现如下:
import java.security.PrivateKey;
/**
* @author lqkj
* @data 2022/11/11 11:02
* 给定一个集合,输出它的所有子集
*/
public class SetUtil {
public static int mSetscount = 1;
public static void getSubSets(int[] sets){
if(sets == null ){
System.out.println("sets is null");
return;
}
int len = sets.length;
//获得所有子集数
int count = (int)Math.pow(2,len);
System.out.println("empty set :{}");
//输出所有子集
for(int i = 1 ; i < count ; i++){
//将整数转换成字符串,如果前面的数为0的话,则将会被去掉,例如 001 只会输出1
String binaryStr = Integer.toBinaryString(i);
System.out.print("Binary is :" + binaryStr + ",subset is {");
//二进制字符串的长度
int binaryLen = binaryStr.length() - 1 ;
//遍历二进制字符串,每次遍历都输出一个子集
for(int j = len - 1 ; j >= 0 && binaryLen >= 0 ; j--,binaryLen--){
//二进制数为1的,则输出对应位置的数值
if(binaryStr.charAt(binaryLen) == '1'){
if(binaryLen == 0 ){
System.out.print(sets[j]);
}else{
System.out.print(sets[j] + ",");
}
}
}
System.out.println("};");
//子集数加1
mSetscount ++;
}
}
}
测试类如下:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author lqkj
* @data 2022/11/11 11:18
* SetUtilTest测试类
*/
public class SetUtilTest {
@Test
public void testGetSubSets(){
//测试集
int[] sets = {1,2,3};
//获得子集数
int count = (int)Math.pow(2,sets.length);
//测试
SetUtil.getSubSets(sets);
assertEquals(count, SetUtil.mSetscount) ;
}
}
输出结果如下所示: