Преобразование отсортированного словаря в массив - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть программа, которая читает файл ASCII и выводит текстовый файл с каждым символом и числом раз, которое он появляется в файле. В этой программе использовался отсортированный словарь, но мне было интересно, если бы вы могли вместо этого использовать массив для хранения символов? Код ниже:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.IO;
using System.Text;
using System.Reflection;

namespace ASCII
{
    class CharacterFrequency
    {
        private char ch;
        private int frequency;

        public char Ch
        {
            get { return ch; }
            set { ch = value; }
        }
        public int Frequency
        {
            get { return frequency; }
            set { frequency = value; }
        }


    }

    class Program
    {
        public string InputFileName = "";
        public string OutputFileName = "output.txt";
        public string FilePath = "";

        public static SortedDictionary<char, ulong> Count(string stringToCount)
        {
            SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();


            foreach (var character in stringToCount)
            {
                if (!characterCount.ContainsKey(character)) // added character to dictionary if only character is absent in charactercount
                {
                    characterCount.Add(character, 1);
                }
                else
                {
                    characterCount[character]++; // increemetned count
                }
            }
            return characterCount;
        }

        static void Main(string[] args)
        {
            var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var inputFileName = Path.Combine(filePath, args[0]);
            var outputFileName = Path.Combine(filePath, args[1]);

            // read data, count chars
            var count = Count(File.ReadAllText(inputFileName));

            // create output content
            var outPut = count.Select(x => $"{x.Key}\t{x.Value}");

            // write it to the output file
            File.WriteAllLines(outputFileName, outPut);

        }
    }
    }

В классе программы находится отсортированный словарь. Есть ли способ вместо этого использовать массив вместо отсортированного словаря? Какой код будет лучше для этого?

Спасибо за помощь.

1 Ответ

0 голосов
/ 04 ноября 2018

Да, и если его ASCII, он будет работать даже быстрее, чем при использовании словаря, без значительного увеличения использования памяти; просто используйте массив ulong[127] и внесите в него индекс, используя значение символа:

public static ulong[] Count(string stringToCount)
{
    var counter = new ulong[127];

    foreach (var character in stringToCount)
    {
        counter[(int)character] += 1;
    }

    return counter;
}

Если вам нужно обрабатывать только печатаемые символы ASCII (значение 32 и выше), вы можете уменьшить массив и использовать смещение 32 для индексации в нем:

public static ulong[] CountPrintable(string stringToCount)
{
    var counter = new ulong[95];

    foreach (var character in stringToCount)
    {
        var charValue = (int)character;

        if (charValue > 31)
        {
           counter[charValue - 32] +=1;
        }
    }

    return counter;
}

И снова смещение, чтобы распечатать их:

counter.Select((x, i) => $"{(char)(i + 32)}\t{counter[i]}");
...