uploaded version of workspace

Lempel Ziv compression Feature Breakdown
Lempel Ziv compression implemented using HashMap<String,Integer> to
stores value and keys
The program will load jpeg images or any arbitrary file byte by byte,
and stores the file as a string
Each string is then passed into function (compress(String
uncompressed)), which will use the Lempel Ziv compression algorithm to
add entry to dictionary_global. dictionary_global's entry size will
increase as more strings (files) are passed into it. for every string,
the compress function returns a ArrayList<Integer>. which are the
values that reference keys for reconstruction of the string.
the each file's ArrayList<Integer> is stored in a overall
ArrayList<ArrayList<Integer>> compressed, this will be the output of
all values for inputted strings (files).

after all files's values are added into the compressed 2d array list,
both the values and dictionary will be serializing  into it's own
serialized file, serialization process does not compress the file, it
even increase the overall file size, so the overall output data is
actually larger. other container such as HashMap<byte[],24-bits
Integer> ArrayList<ArrayList<24-bits Integer>> maybe used in future to
increase the compression ratio.

The serialized file can be loaded with
function(unserializing_dictionary_global or unserializing_key) to
return to their previous data type (hashmap and arraylist)

we can then use function decompress_all to return or reconstruct to the
original file.

to test compression, run lzw_byte_int_char.java

after adding 100 images

sum of input image size: 2363057.0 bytes
sum compressed: 1610346.0 # of integers in the 2d int array
dictionary_global.size() : 805251 bytes
although different container may have different bytes size, the overall
number of references is reduced
(compressed+dictionary_global)/sumrawsize: 68.14672688809453%