title: LZW Compression/ Expansion in Java
body: <p>I am trying to use the <a href="http://algs4.cs.princeton.edu/55compression/LZW.java" rel="nofollow">LZW code provided by Princeton</a> and modify it to vary the size of codeword from 9 to 16 bits. I am unsure of how to do this, but was thinking of maybe using a loop since the size needs to be increased when all codewords of the size before were used. I am just looking for a useful direction to go in, since this is an assignment that I am having trouble starting. </p>
  
  <pre><code>public class LZW {
      private static final int R = 256;        // number of input chars
      private static final int L = 4096;       // number of codewords = 2^W
      private static final int W = 12;         // codeword width
  
  public static void compress() { 
      String input = BinaryStdIn.readString();
      TST&lt;Integer&gt; st = new TST&lt;Integer&gt;();
      for (int i = 0; i &lt; R; i++)
          st.put("" + (char) i, i);
      int code = R+1;  // R is codeword for EOF
  
      while (input.length() &gt; 0) {
          String s = st.longestPrefixOf(input);  // Find max prefix match s.
          BinaryStdOut.write(st.get(s), W);      // Print s's encoding.
          int t = s.length();
          if (t &lt; input.length() &amp;&amp; code &lt; L)    // Add s to symbol table.
              st.put(input.substring(0, t + 1), code++);
          input = input.substring(t);            // Scan past s in input.
      }
      BinaryStdOut.write(R, W);
      BinaryStdOut.close();
  } 
  
  
  public static void expand() {
      String[] st = new String[L];
      int i; // next available codeword value
  
      // initialize symbol table with all 1-character strings
      for (i = 0; i &lt; R; i++)
          st[i] = "" + (char) i;
      st[i++] = "";                        // (unused) lookahead for EOF
  
      int codeword = BinaryStdIn.readInt(W);
      if (codeword == R) return;           // expanded message is empty string
      String val = st[codeword];
  
      while (true) {
          BinaryStdOut.write(val);
          codeword = BinaryStdIn.readInt(W);
          if (codeword == R) break;
          String s = st[codeword];
          if (i == codeword) s = val + val.charAt(0);   // special case hack
          if (i &lt; L) st[i++] = val + s.charAt(0);
          val = s;
      }
      BinaryStdOut.close();
  }
  
  
  
  public static void main(String[] args) {
      if      (args[0].equals("-")) compress();
      else if (args[0].equals("+")) expand();
      else throw new IllegalArgumentException("Illegal command line argument");
      }
  
  }
  </code></pre>