Member 10610788 Ответов: 1

Сжатие и декомпрессия в Java


У меня возникли проблемы с тем, чтобы слишком сильно распаковать строку в java, это базовый класс java, который я беру, поэтому он требует только базовых команд, ничего слишком причудливого. Цель его в том, чтобы уметь печатать
C:\>java Compress -c aaaabbbbbcc 

в командной строке и он будет печатать a4b5c2 (как будто это сжатие строки аргумента).

Другая цель состоит в том, чтобы напечатать
C:\>java Compress -d a5b7c4

и он будет печатать aaaaabbbbbbbcccc (например, он будет распаковывать строку аргумента). Декомпрессия-это проблема, с которой я столкнулся. Вот мой код, любая помощь, которую я получаю, очень ценится.

import java.util.*;
public class Compress{
	public static void main(String args[]){

		Scanner scan=new Scanner(System.in);
		String originalString = scan.nextLine();
		int number = scan.nextInt();
		
		if(args[0].equals("-c"))
		{
			System.out.println("compress");
            compress(originalString);
		}
	
		else if(args[0].equals("-d"))
		{
			System.out.println("decompress");
            decompress(originalString);
		}
		else{System.out.println("Compress program by Kelsey Faram");
		System.out.println("usage: java Compress [-c,-d] < inputFile > outputFile");
		}
	}
	
	
	public static void compress(String originalString)
	{
		int count = 0;
		char comp = originalString.charAt(0);
		for(int i=0; i < originalString.length(); i++){
		originalString.charAt(i);
		
		if(comp==originalString.charAt(i))
		count++;
		else{
			System.out.print(comp+""+count);
			comp=originalString.charAt(i); count=1;
		}	
		} System.out.println(comp+""+count);
	}
	
	public static void decompress(String originalString)
    {
		
	}
	
	
}

TorstenH.

сделал его читабельным.

1 Ответов

Рейтинг:
2

Anton Koekemoer

Я не буду давать вам код, но постараюсь направить вас в правильном направлении.

Это, по-видимому, простое сжатие типа RLE, поэтому декомпрессия очень проста.
Вам нужно понять, что делает метод сжатия, как только вы это сделаете, распаковка должна быть очевидной.

Сжатие будет сканировать входные данные и для каждого символа, который он находит, выводит символ, за которым следует счетчик. Так что распаковка должна быть простой

1. Возьмите символ (x) из строки,
2. Возьмите следующий символ и преобразуйте его в int (y)
3. выведите символ (x), (y) количество раз

Преобразование символа в int в этом случае действительно просто, используя базовый ASCII, символ 0 имеет значение ASCII 48, 1 имеет значение 49 и т. д., Так что :

int count = originalString.charAt(i) - 48;


Кроме того, это работает не только в том случае, если у вас никогда не бывает более 9 повторений символов в строке. Возможно, было бы полезно изменить функцию сжатия, чтобы учесть это, так что если у вас есть последовательность, подобная aaaaaaaaaaaaaaa, то outpput будет a9a5.