Sunday, 29 July 2018

JAVA : Bitmasking

JAVA : Bitmasking


Assume we have many flags with each falg of VARCHAR2(1) in db..
Eg:
QURYABLE_FLAG= Y/N
UPDATABLE_FLAG =  Y/N
MAPPABLE_FLAG = Y/N
...........

Instead of having separate column for each flag in DB, all these things we can store it in single column (ATTRIBUTE_FLAGS     NUMBER)

Internally number represents in bits, and each bit represents one flag
Eg:   ATTRIBUTE_FLAGS      =      1    (0001)  = QURYABLE_FLAG
        ATTRIBUTE_FLAGS      =      2    (0010)  = UPDATABLE_FLAG
        ATTRIBUTE_FLAGS      =      4    (0100)  = MAPPABLE_FLAG
        ..............

Like this NUMBER field we can take 32 bits, so we can use up to 31 flags  (last bit is for +/-)

Eg: assume we want to set/reset QUERYABLE_FLAG -> which is st bit(0001) and number is (1))

setFlag()  -> dbData | 1
resetFlag()  -> dbData & ~ 1
checkFlag()

############################################################################

import java.text.*;
import java.util.*;


public class Test{

    static int attriuteFlag_DbColumnData = 0; //0010 0001 0111

    private static final Map<String, String> indexMap;
    static
    {
        indexMap = new HashMap<String, String>();
        indexMap.put("QUERIABLE_FLAG", "1");
        indexMap.put("MANDATORY_FLAG", "2");
        indexMap.put("UPDATABLE_FLAG", "4");
    }

public static int resetFlag(String attributeFlag,int dbData){
        return dbData & ~Integer.parseInt(indexMap.get(attributeFlag));
    }
   
public static int setFlag(String attributeFlag,int dbData){
        return dbData | Integer.parseInt(indexMap.get(attributeFlag));
    }
   
    public static boolean checkFlag(String attributeFlag,int dbData){
       
        if ((dbData & Integer.parseInt(indexMap.get(attributeFlag))) == Integer.parseInt(indexMap.get(attributeFlag)))
        {
          return true;
        }
        else{
            return false;
        }
    }

   public static void main(String a[]){

        System.out.println("resetFlag : QUERIABLE_FLAG : Before : "+attriuteFlag_DbColumnData);
     System.out.println("resetFlag : QUERIABLE_FLAG : After : " + resetFlag("QUERIABLE_FLAG",attriuteFlag_DbColumnData));
     System.out.println("################################################################");
     System.out.println("setFlag : QUERIABLE_FLAG : Before : "+resetFlag("QUERIABLE_FLAG",attriuteFlag_DbColumnData));
     System.out.println("setFlag : QUERIABLE_FLAG : After : " + setFlag("QUERIABLE_FLAG",resetFlag("QUERIABLE_FLAG",attriuteFlag_DbColumnData)));
   
     System.out.println("========================================================================");
     attriuteFlag_DbColumnData = 1;
     System.out.println("resetFlag : MANDATORY_FLAG : Before : "+attriuteFlag_DbColumnData);
     System.out.println("resetFlag : MANDATORY_FLAG : After : " + resetFlag("MANDATORY_FLAG",attriuteFlag_DbColumnData));
     System.out.println("################################################################");
     System.out.println("setFlag : MANDATORY_FLAG : Before : "+attriuteFlag_DbColumnData);
     System.out.println("setFlag : MANDATORY_FLAG : After : " + setFlag("MANDATORY_FLAG",attriuteFlag_DbColumnData));
   
     System.out.println("======================3333333==========================================");
     attriuteFlag_DbColumnData = 3;
     System.out.println("checkFlag : QUERIABLE_FLAG : For DBData("+attriuteFlag_DbColumnData+") => "+checkFlag("QUERIABLE_FLAG",attriuteFlag_DbColumnData));
     System.out.println("checkFlag : MANDATORY_FLAG : For DBData("+attriuteFlag_DbColumnData+") => "+checkFlag("MANDATORY_FLAG",attriuteFlag_DbColumnData));
     System.out.println("======================2222222==========================================");
     attriuteFlag_DbColumnData = 2;
     System.out.println("checkFlag : QUERIABLE_FLAG : For DBData("+attriuteFlag_DbColumnData+") => "+checkFlag("QUERIABLE_FLAG",attriuteFlag_DbColumnData));
     System.out.println("checkFlag : MANDATORY_FLAG : For DBData("+attriuteFlag_DbColumnData+") => "+checkFlag("MANDATORY_FLAG",attriuteFlag_DbColumnData));

    }
   
   
}





//##################Output ################################################################
// resetFlag : QUERIABLE_FLAG : Before : 0
// resetFlag : QUERIABLE_FLAG : After : 0
// ################################################################
// setFlag : QUERIABLE_FLAG : Before : 0
// setFlag : QUERIABLE_FLAG : After : 1
// ========================================================================
// resetFlag : MANDATORY_FLAG : Before : 1
// resetFlag : MANDATORY_FLAG : After : 1
// ################################################################
// setFlag : MANDATORY_FLAG : Before : 1
// setFlag : MANDATORY_FLAG : After : 3
// ======================3333333==========================================
// checkFlag : QUERIABLE_FLAG : For DBData(3) => true
// checkFlag : MANDATORY_FLAG : For DBData(3) => true
// ======================2222222==========================================
// checkFlag : QUERIABLE_FLAG : For DBData(2) => false
// checkFlag : MANDATORY_FLAG : For DBData(2) => true



###############################################################################
       

Monday, 23 July 2018

JAVA : COLLECTION Tips

JAVA : COLLECTION Tips


Note : HashSet and TreeSet is used to resolve many scenarios (Remove duplicate, find duplicate, sort Array, find Min/Max number in array etc...)

1. Check Duplicate in collection.



2. Want to add objects in order



3. Want to find highest and lowest number in non-sorted array.

1> First add it to TreeSet
2> treeset.first() -> 1
     treeset.last() -> 8

3. SORT HASHTABLE -> JUST CONVERT HASHTABLE TO TREEMAP (Automatically will be sorted)

public static void main (String[] args) {
Hashtable<String, String> ht= new Hashtable<String, String>();
       ht.put("zac", "Chaitanya");
       ht.put("abc", "Ajeet");
       ht.put("yyt", "Test");
       ht.put("ddc", "Demo");
       ht.put("ssa", "Anuj");

    Map<String, String> map = new TreeMap<String, String>(ht);
    for(Map.Entry<String,String> entry : map.entrySet()) {
          String key = entry.getKey();
          String value = entry.getValue();
        
          System.out.println(key + " => " + value);
    }

OR

    Map hm = new TreeMap(ht);
    Set<String> keys = hm.keySet();
        for(String key: keys){
            System.out.println("Value of "+key+" is: "+hm.get(key));
        }


}