yuguo21工具类之《多选状态位》

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);
		}
		
	}

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值