前言
其实,这个标题也不知道怎么写,对于常见复选框如何在数据库保存的问题,一种常见的做法是用1,2,4,8 … 等值来对应每一项,然后保存的时候把勾选的每一项相加即可得到一个整数,并且用这个整数可以还原勾选的各项内容。
比如,勾选了2,4,8则保存成14,回显到页面的时候,14又可分解为2,4,8
原理
对于计算机专业的同学来说,很容易理解。上面的1,2,4,8…转换成二进制就是:
1:0001
2:0010
4:0100
8:1000
…
相当于给了4个占位符,0000
,分别表示4个选项,如果第一项勾选了
那就在倒数第一位标上1,如果第二项勾选了就在倒数第二位标上1,于是就变成了:
选1: 0001
(1)
选2: 0010
(2)
选1和2:0011
(1+2=3)
选2和4:1010
(2+4=6)
全选:1111
(1+2+4+8=15)
括号里面的数字为十进制表示,存在数据库里的话只要存十进制就可以了。
代码实现
-
存储勾选的值
public static int save(int ...vals) { int sum = 0; for (int val : vals) { sum |=val; } return sum; }
-
判断某个值是否包含在已勾选的值中
public static boolean contains(int singleVal, int sumVal) { return (singleVal & sumVal) == singleVal; }
-
分解勾选的值
public static List<Integer> separate(int sumVal) { List<Integer> valList = new ArrayList<>(); for (int val = 1; val <= sumVal; val <<= 1) { if (contains(val, sumVal)) { valList.add(val); } } return valList; }
实例
有4个选项:A, B, C, D
将其value定为:1, 2, 4, 8
勾选了A,C, 则存储值为 save(1, 4)
= 5
判断A是否包含在已选列表中:contains(1, 5)
= true
判断D是否包含在已选列表中:contains(8, 5)
= false
回显已选列表:separate(5)
= [1, 4]