2013-05-08 4 views
0

Я следовал за реализацией Rosetta Java code.LZW декодирование пропускает первый ввод кода

Я попытался сделать это кодирование LZW с помощью своего собственного Словаря, а не с использованием ASCII Dictionary, который использовался. Когда я пытаюсь использовать свою собственную Dictioanry, возникает проблема с декодированием ... Результат неверен, потому что каждое из декодированных слов не просматривает первое письмо 'a'. Результат должен быть 'abraca abrac abra' и не 'braca brac bra'

Я вижу проблему в декодировании() метод в String act = "" + (char)(int)compressed.remove(0); Это удалит все первое «а» письмо. Но у меня нет никаких идей, как я могу изменить эту строку ... Например, если я использую String act = ""; вместо вышеуказанной строки ... кодирование будет очень неправильным или использовать другую команду ... Я не знаю, я знаю, как я могу решить эту небольшую проблему ... Или, может быть, я ищу плохое решение.

public class LZW { 


public static List<Integer> encode(String uncompressed) { 

    Map<String,Integer> dictionary = DictionaryInitStringInt();   
    int dictSize = dictionary.size(); 

    String act = ""; 
    List<Integer> result = new ArrayList<Integer>(); 

    for (char c : uncompressed.toCharArray()) { 
     String next = act + c; 
     if (dictionary.containsKey(next)) 
      act = next; 
     else { 
      result.add(dictionary.get(act)); 
      // Add next to the dictionary. 
      dictionary.put(next, dictSize++); 
      act = "" + c; 
     } 
    } 

    // Output the code for act. 
    if (!act.equals("")) 
     result.add(dictionary.get(act)); 
    return result; 
} 

public static String decode(List<Integer> compressed) { 

    Map<Integer,String> dictionary = DictionaryInitIntString();   
    int dictSize = dictionary.size(); 

    String act = "" + (char)(int)compressed.remove(0); 
    //String act = ""; 
    String result = act; 

    for (int k : compressed) {    
     String entry; 
     if (dictionary.containsKey(k)) 
      entry = dictionary.get(k); 
     else if (k == dictSize) 
      entry = act + act.charAt(0); 
     else 
      throw new IllegalArgumentException("Nincs ilyen kulcs: " + k); 

     result += entry; 

     dictionary.put(dictSize++, act + entry.charAt(0)); 

     act = entry; 
    } 
    return result; 
} 

public static Map<String,Integer> DictionaryInitStringInt() 
{    
    char[] characters = {'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n', 
        'o','p','q','r','s','t','u','v','w','x','y','z',' ','!', 
        '?','.',','}; 
    int charactersLength = characters.length; 

    Map<String,Integer> dictionary = new HashMap<String,Integer>(); 

    for (int i = 0; i < charactersLength; i++) 
      dictionary.put("" + characters[i], i); 

    return dictionary; 
} 

public static Map<Integer,String> DictionaryInitIntString() 
{    
    char[] characters = {'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n', 
        'o','p','q','r','s','t','u','v','w','x','y','z',' ','!', 
        '?','.',','}; 
    int charactersLength = characters.length; 

    Map<Integer,String> dictionary = new HashMap<Integer,String>(); 

    for (int i = 0; i < charactersLength; i++) 
      dictionary.put(i,"" + characters[i]); 

    return dictionary; 
} 

public static void main(String[] args) { 

    List<Integer> compressed = encode("abraca abrac abra"); 
    System.out.println(compressed); 

    String decodeed = decode(compressed); 
    // decodeed will be 'braca brac bra' 
    System.out.println(decodeed); 
} 

}

ответ

0

Розеттском пример использования

"" + (char) (int) compressed.remove(0); 

потому, что первые 256 записей о dictionnary карте точно значения 'символьные'.

С пользовательской dictionnary эта линия должна быть:

String act = dictionary.get(compressed.remove(0));