Я пытаюсь создать программу на Java, которая сжимает строку.
Итак, у меня есть большое число, сгенерированное из троичной строки.Я хотел бы «сжать» число, преобразовав его в базовый 0xFFFF, и каждая цифра будет символом UTF-16.Проблема в том, что когда я вывожу эту строку, затем пытаюсь ее распаковать и получить число обратно, числа не совпадают.Кроме того, прямая передача выходных данных из алгоритма сжатия и его ввод вручную дает отличный результат от алгоритма распаковки.Я также попытался взять вывод и вставить его как строковый литерал в алгоритме декомпрессии, и это тоже не дало того же результата.
Я пробовал тестировать с меньшими троичными строками, и они, кажется, работают,за исключением иногда, они случайным образом производят результат, отличный от ожидаемогоЯ понятия не имею, в чем проблема.
Алгоритм сжатия:
import java.io.*;
import java.math.BigInteger;
public class Switch{
public static void main(String[] args)throws IOException{
String str = new BufferedReader(new InputStreamReader(new FileInputStream(FileDescriptor.in))).readLine();
BigInteger x = BigInteger.ZERO;
//input String only contains 'a', 'x', and 'y'
for (int i = str.length() - 1; i >= 0; i --){
x = x.multiply(BigInteger.valueOf(3L));
switch (str.charAt(i)){
case 'a': x = x.add(BigInteger.ONE); break;
case 'x': x = x.add(BigInteger.valueOf(2));
}
}
StringBuilder sb = new StringBuilder();
//compression algorithm here
while (x.signum() > 0){
int point = x.and(BigInteger.valueOf(0xffff)).intValue();
sb.appendCodePointAt(point);
x = x.shiftRight(16);
}
System.out.print(sb.reverse());
}
}
Алгоритм декомпрессии:
import java.math.BigInteger;
import java.io.*;
public class Test{public static void main(String[] a)throws IOException{
BigInteger £=BigInteger.valueOf(3);
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
//in the final product the above string initialization will be replaced with a UTF-16 String literal
BigInteger q = BigInteger.ZERO;
for (int i = 0; i < str.length(); i ++){
q = q.shiftLeft(16);
q = q.add(BigInteger.valueOf(str.codePointAt(i)));
}
//Everything below here works as intended
while(q.compareTo(BigInteger.ONE)>0){System.out.write("axy".charAt((q.mod(£).intValue())));q=q.divide(£);}System.out.println();}}
Для входной строки
"aaxaaayyxaaaxaaaaayaayaaayyyaaaaayaaaaxyaaaaayxxyaaaxaayxayaxaxayyyaaaayaaaaxaxaayaaaayxxa",
Я ожидаю, что вывод будет точно таким же (сжимая, а затем не распаковывая ввод), если он не изменяет входные данные, если они не изменяются, то ввод, а не декомпрессия должен произойти;Тем не менее, я получаю вывод
"xxyxxxaayxxxyxxxxxaxxaxxxaaaxxxxxaxxxxyaxxxxxaxyaxxyaxxxxxayyaxxxyxxayxaxyxyxaaaxxxxaxxxxyxyxxaxxxxayy"
Кто-нибудь знает, почему эти два элемента не похожи друг на друга?