adding more methods
This commit is contained in:
parent
e8a1616eb4
commit
84a6b24305
2 changed files with 130 additions and 4 deletions
|
@ -16,6 +16,8 @@
|
||||||
package com.redhat.trie;
|
package com.redhat.trie;
|
||||||
|
|
||||||
public class HuffNode {
|
public class HuffNode {
|
||||||
|
public static final Object END_NODE = new Object();
|
||||||
|
|
||||||
private long id = 0;
|
private long id = 0;
|
||||||
private Object value = null;
|
private Object value = null;
|
||||||
private int weight = 0;
|
private int weight = 0;
|
||||||
|
|
|
@ -17,14 +17,23 @@ package com.redhat.trie;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Util
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Util
|
* Util
|
||||||
|
@ -41,6 +50,9 @@ public class Util {
|
||||||
return this.ctx;
|
return this.ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* populate the parent PathNode, with the Strings in contents
|
||||||
|
*/
|
||||||
public PathNode makePathTree(List<String> contents, PathNode parent) {
|
public PathNode makePathTree(List<String> contents, PathNode parent) {
|
||||||
PathNode endMarker = new PathNode(getContext());
|
PathNode endMarker = new PathNode(getContext());
|
||||||
for (String path : contents) {
|
for (String path : contents) {
|
||||||
|
@ -51,6 +63,9 @@ public class Util {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PrettyPrint a PathNode tree
|
||||||
|
*/
|
||||||
public static void printTree(PathNode pn, int tab) {
|
public static void printTree(PathNode pn, int tab) {
|
||||||
StringBuffer nodeRep = new StringBuffer();
|
StringBuffer nodeRep = new StringBuffer();
|
||||||
for (int i = 0; i <= tab; i++) {
|
for (int i = 0; i <= tab; i++) {
|
||||||
|
@ -78,6 +93,9 @@ public class Util {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PrettyPrint a HuffNode tree
|
||||||
|
*/
|
||||||
public static void printTrie(HuffNode hn, int tab) {
|
public static void printTrie(HuffNode hn, int tab) {
|
||||||
StringBuffer nodeRep = new StringBuffer();
|
StringBuffer nodeRep = new StringBuffer();
|
||||||
for (int i = 0; i <= tab; i++) {
|
for (int i = 0; i <= tab; i++) {
|
||||||
|
@ -268,6 +286,112 @@ public class Util {
|
||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private byte[] makeNodeDictionary(HuffNode stringParent,
|
||||||
|
HuffNode pathNodeParent, List<PathNode> pathNodes)
|
||||||
|
throws UnsupportedEncodingException, IOException {
|
||||||
|
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
int nodeSize = pathNodes.size();
|
||||||
|
if (nodeSize > 127) {
|
||||||
|
ByteArrayOutputStream countBaos = new ByteArrayOutputStream();
|
||||||
|
boolean start = false;
|
||||||
|
for (byte b : toByteArray(nodeSize)) {
|
||||||
|
if (b == 0 && !start) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
countBaos.write(b);
|
||||||
|
start = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baos.write(128 + countBaos.size());
|
||||||
|
countBaos.close();
|
||||||
|
baos.write(countBaos.toByteArray());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
baos.write(nodeSize);
|
||||||
|
}
|
||||||
|
StringBuffer bits = new StringBuffer();
|
||||||
|
String endNodeLocation = findHuffPath(stringParent, HuffNode.END_NODE);
|
||||||
|
for (PathNode pn : pathNodes) {
|
||||||
|
for (NodePair np : pn.getChildren()) {
|
||||||
|
bits.append(findHuffPath(stringParent, np.getName()));
|
||||||
|
bits.append(findHuffPath(pathNodeParent, np.getConnection()));
|
||||||
|
}
|
||||||
|
bits.append(endNodeLocation);
|
||||||
|
while (bits.length() >= 8) {
|
||||||
|
int next = 0;
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
next = (byte) next << 1;
|
||||||
|
if (bits.charAt(i) == '1') {
|
||||||
|
next++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baos.write(next);
|
||||||
|
bits.delete(0, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bits.length() > 0) {
|
||||||
|
int next = 0;
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
next = (byte) next << 1;
|
||||||
|
if (i < bits.length() && bits.charAt(i) == '1') {
|
||||||
|
next++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baos.write(next);
|
||||||
|
}
|
||||||
|
byte[] result = baos.toByteArray();
|
||||||
|
/* FIXME add debugging? :-)
|
||||||
|
if (treeDebug) {
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(result);
|
||||||
|
int value = bais.read();
|
||||||
|
while (value != -1) {
|
||||||
|
log.debug(value);
|
||||||
|
value = bais.read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
baos.close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] toByteArray(int value) {
|
||||||
|
return new byte[] {
|
||||||
|
(byte) (value >> 24),
|
||||||
|
(byte) (value >> 16),
|
||||||
|
(byte) (value >> 8),
|
||||||
|
(byte) value};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String findHuffPath(HuffNode trie, Object need) {
|
||||||
|
HuffNode left = trie.getLeft();
|
||||||
|
HuffNode right = trie.getRight();
|
||||||
|
if (left != null && left.getValue() != null) {
|
||||||
|
if (need.equals(left.getValue())) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (right != null && right.getValue() != null) {
|
||||||
|
if (need.equals(right.getValue())) {
|
||||||
|
return "1";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (left != null) {
|
||||||
|
String leftPath = findHuffPath(left, need);
|
||||||
|
if (leftPath.length() > 0) {
|
||||||
|
return "0" + leftPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (right != null) {
|
||||||
|
String rightPath = findHuffPath(right, need);
|
||||||
|
if (rightPath.length() > 0) {
|
||||||
|
return "1" + rightPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue