#java #c# #translate #huffman-code
#java #c# #перевести #хаффман-код
Вопрос:
Ну, вы увидите, проблема в том, что я перевожу код C # java, который шифрует текстовый файл методом Хаффмана, на java, где исходная программа работает идеально, но вопрос здесь в том, что мне это нужно на C #.
Я пытаюсь перевести это на C #, но это генерирует 4 ошибки внутри методов setPrefixCodes и buildTree, в которых я ничего не понимаю, и я не знаю, что я перевожу неправильно, или мне нужно реализовать что-то еще.
Мне действительно нужно знать, как это правильно перевести
Помогите!!!!!!
namespace Huffman_v2
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
String documento;
private static IDictionary<char, string> charPrefixHashMap = new Dictionary<char, string> ();
internal static HuffmanNode root;
private void btnCifrar_Click(object sender, EventArgs e)
{
string txtText = documento;
IDictionary<char, int> freq = new Dictionary<char, int> ();
for (int i = 0; i < txtText.Length; i )
{
if (!freq.ContainsKey(txtText[i]))
{
freq[txtText[i]] = 0;
}
freq[txtText[i]] = freq[txtText[i]] 1;
}
txtFrecuencia.Text = freq.ToString();
root = buildTree(freq);
setPrefixCodes(root, new StringBuilder());
StringBuilder s = new StringBuilder();
for (int i = 0; i < txtText.Length; i )
{
char c = txtText[i];
s.Append(charPrefixHashMap[c]);
}
string xs = decode(s.ToString());
txtPrefijos.Text = charPrefixHashMap.ToString();
txtCifrado.Text = xs.ToString();
}
private static void setPrefixCodes(HuffmanNode node, StringBuilder prefix)
{
if (node != null)
{
if (node.left == null amp;amp; node.right == null)
{
charPrefixHashMap[node.data] = prefix.ToString();
}
else
{
prefix.Append('0');
setPrefixCodes(node.left, prefix);
prefix.deleteCharAt(prefix.Length - 1); //error en .deleteChatAt
prefix.Append('1');
setPrefixCodes(node.right, prefix);
prefix.deleteCharAt(prefix.Length - 1); //error en .deleteChatAt
}
}
}
private static string decode(string s)
{
StringBuilder stringBuilder = new StringBuilder();
HuffmanNode temp = root;
for (int i = 0; i < s.Length; i )
{
int j = int.Parse(s[i].ToString());
if (j == 0)
{
temp = temp.left;
if (temp.left == null amp;amp; temp.right == null)
{
stringBuilder.Append(temp.data);
temp = root;
}
}
if (j == 1)
{
temp = temp.right;
if (temp.left == null amp;amp; temp.right == null)
{
stringBuilder.Append(temp.data);
temp = root;
}
}
}
return stringBuilder.ToString();
}
private static HuffmanNode buildTree(IDictionary < char, int > freq)
{
PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<HuffmanNode>(); // esta linea tiene el error en PriorityQueue<HuffmanNode>
ISet<char> keySet = (ISet<char>) freq.Keys;
foreach(char ? c in keySet) {
HuffmanNode huffmanNode = new HuffmanNode();
huffmanNode.data = (char) c;
huffmanNode.frequency = freq.get(c); //aqui en .get
huffmanNode.left = null;
huffmanNode.right = null;
priorityQueue.offer(huffmanNode);
}
Debug.Assert(priorityQueue.size() > 0);
while (priorityQueue.size() > 1)
{
HuffmanNode x = priorityQueue.peek();
priorityQueue.poll();
HuffmanNode y = priorityQueue.peek();
priorityQueue.poll();
HuffmanNode sum = new HuffmanNode();
sum.frequency = x.frequency y.frequency;
sum.data = '-';
sum.left = x;
sum.right = y;
root = sum;
priorityQueue.offer(sum);
}
return priorityQueue.poll();
}
}
}
Комментарии:
1. Было бы полезно, если бы вы показывали полученные ошибки и отмечали строки кода, на которые они ссылаются.
2. Почему вы используете stringbuilder вместо того, чтобы просто использовать строку?
3. Вместо
... = freq.get(c);
, который, как я предполагаю, является java, вы должны быть в состоянии сказать... = freq[c];
,