2011-03-12 13 views
15

Quiero almacenar 4 posibilidades booleanas en un solo valor. Por ejemplo, Quiero un único valor que indica si una persona es:Cómo representar 4 posibilidades booleanas en un solo valor

IsSingle
IsGraduate
IsMale
IsLookingForPartner

Por lo que es bueno para almacenarlos en un byte, cuyos 4 bits pueden ser asignados, uno para cada parámetro. Si el bit se establece en 1, ese parámetro booleano es verdadero. Así que puedo hacer operaciones de cambio de bit para encontrar lo que todos son verdad. si el valor del byte es 111, entonces los primeros tres parámetros son verdaderos. ¿Es una buena manera? ¿Hay una mejor manera de implementar esto?

Necesito almacenar este valor como un solo parámetro en la base de datos.

Respuesta

17

Banderas de bits.

public static final int IsSingle = 1 << 0; 
public static final int IsGraduate = 1 << 1; 
public static final int IsMale = 1 << 2; 
public static final int IsLookingForPartner = 1 << 3; 

... 

if ((Value & IsSingle) != 0) { 
} 

if ((Value & IsGraduate) != 0) { 
} 

// Set "Single" 
Value |= IsSingle; 

// Remove "Graduate" 
Value &= ~IsGraduate; 
0

Realmente debe usar variables separadas para almacenar estos. Una persona puede ser un graduado, soltero, masculino, y en busca de un compañero. Simplemente no puede almacenar todas esas posibilidades en un solo booleano.

6

Utilice el embalaje binario. Defina constantes para ellos como:

IsSingle = 1; 
IsGraduate = 2; 
IsMale = 4; 
IsLookingForPartner = 8; 

Y combínelos con operación OR lógica. De esta manera cada posibilidad estará representado por un bit en la representación binaria de un number.You puede comprobar por Y-ing el valor lleno de cualquiera de las constantes:

short status = IsSingle | IsMale; // will give 5 

if ((status & IsMale) != 0) 
    System.out.println("Male."); 
+0

+1 agradable y limpio;) – kapa

3

Lo mejor sería una boolean[4] donde se guarde cada valor en diferentes celdas de la matriz, ¡y necesita un espacio mínimo!

escribir este pedazo de código en su clase:

private boolean[] values = new boolean[4]; 

void setValue(String name, boolean value){ 
    if(name=="IsSingle") 
     values[0] = value; 
    else if(name=="IsGraduate") 
     values[1] = value; 
    else if(name=="IsMale") 
     values[2] = value; 
    else if(name=="IsLookingForPartner") 
     values[3] = value; 
} 

boolean getValue(String name){ 
    if(name=="IsSingle") 
     return values[0]; 
    else if(name=="IsGraduate") 
     return values[1]; 
    else if(name=="IsMale") 
     return values[2]; 
    else if(name=="IsLookingForPartner") 
     return values[3]; 
    else 
     return false; 
} 

ahora sólo tiene que utilizar esto como: setValue("IsGraduate", true);getValue("IsMale");

11

De hecho, es posible hacer esto, sin embargo no se recomienda.

¿Qué pasa si quiere encontrar en su base de datos a todos los estudiantes que son solteros? ¿O hombre? Si bien el espacio que está guardando es mínimo, está renunciando a la posibilidad de indexar sus datos para una búsqueda más rápida no solo eso, sino para encontrar cualquier dato que tenga criterios de consulta dependiendo de cualquiera de estos atributos, necesitaría realizar cambios de bit. operaciones en todos los registros (o en comparación con valores enteros múltiples) que terminarían siendo terriblemente lentos.

La complejidad añadida en realidad no ofrece mucho beneficio en mi humilde opinión, las bases de datos pueden manejar 4 campos separados y hay buenas razones para hacerlo de esa manera (por ejemplo, consultar sus datos en esos campos fácilmente).

3

¿Ha considerado utilizar un byte para almacenar los valores? A continuación, podría hacer algo como lo siguiente:

public Byte setDetails(bool isSingle, bool isGraduate, bool isMale, bool isLooking) 
{ 
    Byte result = 0; 

    //Set the details 
    if (isSingle) result = result | 1; 
    if (isGraduate) result = result | 2; 
    if (isMale) result = result | 4; 
    if (isLooking) result = result | 8; 

    return result; 
} 

Luego, más tarde se puede utilizar un código como:

Byte details = getDetails(true, false, true, false); 
bool isSingle = (details & 1) != 0; 

para obtener los detalles.

... Dicho esto, por el bien de tres bytes, ¿vale la pena todo el trabajo extra y las constantes?

+0

Tu código no se compila. Su 'boolean', no' bool', y también necesita reemplazar 'result = result | 1' con 'resultado = (byte) (resultado | 1)' y así sucesivamente. –

+0

@Luke - Mi error, lo preparé rápidamente sin verificar. Debería haber puesto un descargo de responsabilidad. –

3

Si desea utilizar la solución solo por diversión, está bien, pero si se trata de una aplicación profesional NO implemente esto en un solo parámetro en la base de datos. Si piensa en que los cambios del negocio:

  1. Eliminar isLookingForPartner // bit redundante será todo el tiempo - para sí importa
  2. Añadir nuevos parámetros
  3. Buscar todas las personas que están isLookingForPartner == true// será lento
10

Puede encontrar que un EnumSet es una forma natural de representar esta información. Un EnumSet usa una máscara de bits debajo del capó.

enum Interest { 
    IsSingle, 
    IsGraduate, 
    IsMale, 
    IsLookingForPartner 
} 

EnumSet<Interest> interests = EnumSet.of(Interest.IsSingle, Interest.IsMale); 

Puede agregar cualquier cantidad de valores enum.

Cuestiones relacionadas