将设置数组存储到数据库行中

时间:2018-07-29 20:28:31

标签: java

我想优化数据库行应用程序设置。像这样

10 - enabled option 1;
12 - enabled option 2;
13 - enabled option 3;

整个数字作为1073741823存储在数据库中。

我试图实现这一点:

public void test(){

    // Let's say you get a String representing your option from your database
    String optionFromDB= "132456";
    // optionFromDB is a number like "132456"
    // We transform it to bigDecimal:
    BigDecimal myOptions=new BigDecimal(optionFromDB);

    // Then we can use it.

    // enable the option X (X is a number)
    myOptions.setBit(2);

    // Disable option X
    myOptions.clearBit(2);

    // Save the options to the db:
    String newValToSave=myOptions.toString();

    // do something if option x enable:
    if (myOptions.testBit(123)){ 
        System.out.println("test");
    }       
}

我该如何正确实施?

2 个答案:

答案 0 :(得分:1)

好吧,只使用一个数字,我们称它为 state 。类型应根据您将拥有的选项数量来确定。例如,如果您有10个选项,则Integer绰绰有余。对于每个选项,您可以使用此整数状态的一位。

因此要设置第一个选项,只需设置第一个位,通常将第一个选项的第i个位设置。要查看是否启用了ith选项,请检查 state 的ith位是否已设置。

代码关键点

要设置第i位,可以使用以下代码:

state |= 1 << i;

要测试第i位,请执行以下操作:

state & (1L << i)) != 0;

要清除第i位,请使用:

state &= ~(1 << i);

答案 1 :(得分:1)

假设值是整数-这将为您提供32个选项。如果那还不够,您可以花很长时间(64位)或将相同的逻辑应用于任意数量的位。

  • 启用位n:值| = 1 <<< n
  • 要禁用位n:值&=〜(1 <<< n)
  • 要测试n位:(值&(1 <<< n))!= 0
  • 要转换为字符串:String s = Integer.toString(value)
  • 要从字符串转换:value = Integer.parseInt(s)