开发时遇到个需要存储checkbox 数据,目前选项最多包含11个可选。如果是我之前的思路,就直接在MySQL里面存上所选中的数据标识,以“,”分隔即可。
今天项目经理说了一个新思路,虽然我觉得并不怎么合适,但是当前项目上使用了,在此记录一下。
思路
前端仍然返回选项对应标识,即“1”,“2”,“3”……
- 对应标识数字存储转换为二进制的表达形式α,但非转换为二进制
即:
“1”→“0000000001”,
“2”→“0000000010”,
“3”→“0000000100”,
“4”→“0000001000”,
“5”→“0000010000”,
“6”→“0000100000”,
“7”→“0001000000”,
“8”→“0010000000”,
“9”→“0100000000” - 二进制表达式转为十进制β
即:
“0000000001”→“1”,
“0000000010”→“2”,
“0000000100”→“4”,
“0000001000”→“8”,
“0000010000”→“16”,
“0000100000”→“32”,
“0001000000”→“64”,
“0010000000”→“128”,
“0100000000”→“256” - 当用户选择某项时,前端出来“1”,“5”,“6”等具体选项时,遍历这些选项,取选项数字对应的β数据取异或。
例:
0^1 → 1
1^5 → 17
17^6 → 49 - 最终结果转换为二进制(这次真的是十进制转二进制)
49 → 110001
把最终110001保存到数据库中。当前项目在返回时也直接返回110001给前端页面。用户直接看110001。
总结:
- 转换过程繁琐,但只是不好理解而已,写完一遍以后也不怎么管。
- 结果集返回一个二进制的表达形式,个人觉得对用户体验很不友好。虽然当前项目面向的是专业人员,但我认为系统需要向傻瓜式操作来开发。直接在数据库中存储标识,前端展示时格式化为数据字典中checkbox对应的汉字更直观。
- 该思路异或处理是关键,半路出家的Javaer还没用过异或^ (惭愧~)
- 项目需求什么就写什么。
代码实现
package test;
import java.util.ArrayList;
import java.util.List;
/**
* @author Theo
* @date 2021/8/17
*/
public class Test {
public static void main(String[] args) {
//list为模拟前端给传递来的选项
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(5);
list.add(6);
c(list);
}
private static void c(List<Integer> list){
int[] numarry = b();
int aim = 0;
for(Integer i:list){
System.out.println("@@@@@@@");
System.out.println(aim);
System.out.println(i);
aim = aim ^ numarry[i-1];
System.out.println(aim);
}
System.out.println("结果:"+Integer.toBinaryString(aim));
}
/**
* 前端存储标识对应的二进制形式α结果集
* @return
*/
private static List<String> a(){
List<String> mainList = new ArrayList<>();
mainList.add("0000000000000001");
mainList.add("0000000000000010");
mainList.add("0000000000000100");
mainList.add("0000000000001000");
mainList.add("0000000000010000");
mainList.add("0000000000100000");
mainList.add("0000000001000000");
mainList.add("0000000010000000");
mainList.add("0000000100000000");
mainList.add("0000001000000000");
mainList.add("0000010000000000");
return mainList;
}
/**
* 二进制形式α的转换为十进制β结果集
* @return
*/
private static int[] b(){
List<String> list = a();
int[] numarry = new int[list.size()];
for(int i=0;i<list.size();i++){
Integer x = Integer.parseInt(list.get(i),2);
System.out.println(x);
numarry[i]=x;
}
return numarry;
}
}
打印结果
1
2
4
8
16
32
64
128
256
512
1024
@@@@@@@
0
1
1
@@@@@@@
1
5
17
@@@@@@@
17
6
49
@@@@@@@
49
9
305
结果:100110001