JAVA最科学的多状态记录
数据库当中一个表的字段越少效率越高,所有科学的利用一个字段,是我们势在必行的。下面是我开发的多状态,但字段记录法。非常实用。
以下是测试代码:
@Test
public void test(){
List<String> status = new ArrayList<String>();
status.add("数学");status.add("语文");status.add("物理");status.add("化学");status.add("政治");
StatusBitUtil staBitUtil = StatusBitUtil.StatusBitUtilFactory(status);
List<String> stax = new ArrayList<String>();
stax.add("数学");stax.add("政治");
int bitx = staBitUtil.getBit(stax);
System.out.println(bitx);
List<String> stay = staBitUtil.getStatus(bitx);
for (String xVal : stay){
System.out.println(xVal);
}
}
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
/**
* yuguo21工具类之《多选状态位》
* QQ:80303857
* @author solid
*
*/
public class StatusBitUtil {
private List<String> status = null;
private Map<Integer,String> statusBitMap = new HashMap<Integer, String>();
private int summation = 0;
private StatusBitUtil (List<String> status){
this.status = status;
for (int i=0;i<status.size();i++){
int offsetVal = 1<<i;
summation += offsetVal;
statusBitMap.put(offsetVal, status.get(i));
}
}
/**
* 类生成器,请不要这样使用StatusBitUtil。StatusBitUtilFactory(someParm).someMedth(xx);
* 推荐 StatusBitUtil someBody = StatusBitUtil。StatusBitUtilFactory(someParm);
* someBody.someMedth(xx);
* @param status 所有状态
* @return
*/
public static StatusBitUtil StatusBitUtilFactory(List<String> status){
return new StatusBitUtil(status);
}
/**
* 根据特定数值返回所对应的所有状态
* @param bitSum 状态值
* @return
*/
public List<String> getStatus(int bitSum){
List<String> statusList = new ArrayList<String>();
int [] allBit = toBinary(bitSum);
for (int i=0;i<allBit.length;i++){
int key = allBit[i];
String val = statusBitMap.get(key);
statusList.add(val);
}
return statusList;
}
/**
* 传递过来状态值(s>0),返回状态位(b>=0)
* @param status 状态值
* @return 返回0,并未找到对应状态位,大于0返回所有状态位和
*/
public int getBit(List<String> status){
int retVal = 0;
int i=0;
for (String thisStatusVal : this.status){
for (String statusVal : status){
if (thisStatusVal.equals(statusVal)){
int offsetVal = 1<<i;
retVal += offsetVal;
}
}
i++;
}
return retVal;
}
/**
* 最多可设置多少状态为
* @return 可设置状态为最大值
*/
public int maxStatusBit(){
return Integer.SIZE;
}
/**
* 把二进制数按位拆分后的整数集合
* @param bit
* @return
*/
private int[] toBinary(int bit){
String bin = Integer.toBinaryString(bit);
char[] charBin = bin.toCharArray();
int[] retVal = new int[trueVal(charBin)];
/**
* i=迭代/位移,x=按位获取,y=设置最终数值
*/
for(int i=(charBin.length-1),x=0,y=0;i>-1;i--,x++){
char tempC = charBin[x];
int tempInt = new Integer(tempC+"");
int bitBin = tempInt<<i;
if (bitBin>0){
retVal[y] = bitBin;
y++;
}
}
return retVal;
}
private int trueVal(char[] charBin){
int retVal = 0;
for (char bin : charBin){
if (bin != '0'){
retVal++;
}
}
return retVal;
}
/**
* 全选所有状态位
* @return
*/
public int allStatus(){
return this.summation;
}
/**
* 测试使用构造函数
*/
public StatusBitUtil (){}
@Test
public void test(){
List<String> status = new ArrayList<String>();
status.add("数学");status.add("语文");status.add("物理");status.add("化学");status.add("政治");
StatusBitUtil staBitUtil = StatusBitUtil.StatusBitUtilFactory(status);
List<String> stax = new ArrayList<String>();
stax.add("数学");stax.add("政治");
int bitx = staBitUtil.getBit(stax);
System.out.println(bitx);
List<String> stay = staBitUtil.getStatus(bitx);
for (String xVal : stay){
System.out.println(xVal);
}
}
}