Добавление символов в список массивов, только если он еще не существует - PullRequest
0 голосов
/ 30 ноября 2018

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

class CharacterFrequency
{
    char ch;
    int frequency;
    public char getCharacter()
    {
        return ch;
    }
    public void setCharacter(char ch)
    {
        this.ch = ch;
    }
    public int getfrequency()
    {
        return frequency;
    }
    public void setfrequency(int frequency)
    {
        this.frequency = frequency;
    }

    static void Main()
    {
        Console.WriteLine("Enter the file path");
        var InputFileName = Console.ReadLine();

        Console.WriteLine("Enter the outputfile name");
        var OutputFileName = Console.ReadLine();

        StreamWriter streamWriter = new StreamWriter(OutputFileName);
        string data = File.ReadAllText(InputFileName);
        ArrayList al = new ArrayList();

        //create two for loops to traverse through the arraylist and compare
        for (int i = 0; i < data.Length; i++)
        {
            int k = 0;
            int f = 0;

            for (int j = 0; j < data.Length; j++)
            {
                if (data[i].Equals(data[j]))
                {
                    f++;
                }
            }

            if (!al.Contains(data[i]))
            {
                al.Add(data[i] + "(" + (int)data[i] + ")" + f + " ");
            }
            else
            {
                k++;
            }

            //i added the below if statement but it did not fix the issue
            foreach (var item in al)
            {
                streamWriter.WriteLine(item);
            }
        }

        streamWriter.Close();
    }
}

Код компилируется и прекрасно работает, но выходной файл неверен.Это добавление писем, которые уже были рассмотрены.Я добавил изображение с выходным файлом, показывающим неправильный вывод, который он создает.-> введите описание изображения здесь

Как проверить, существует ли символ в списке массивов?Способ, которым я пользуюсь, не работает должным образом, и я работаю над этим уже несколько недель, но безуспешно.Я попытался использовать отладчик, но эта проблема не будет отображаться там, поскольку код все еще выполняется и компилируется правильно.

Ответы [ 2 ]

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

ArrayList не очень подходит для этой задачи, и фактически ArrayList больше не используются.Если кто-то говорит вам, что у вас есть , чтобы сделать это с ArrayList

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

Вот один из способов сделать это:

var inputPath = @"c:\temp\temp.txt";
var outputPath = @"c:\temp\results.txt";
var data = new Dictionary<char, int>();

// For each character in the file, add it to the dictionary
// or increment the count if it already exists
foreach (var character in File.ReadAllText(inputPath))
{
    if (data.ContainsKey(character)) data[character]++;
    else data.Add(character, 1);
}

// Create our results summary
var results = data.ToList()
    .Select(item => $"{item.Key} ({(int) item.Key}) {item.Value}");

// Write results to output file
File.WriteAllLines(outputPath, results);

Если у вас есть использовать ArrayList (который никто больше не использует, но вы говорите, что вы по какой-то причине), это было бы полезно только для сохранения результатов, но не для отслеживания количества.

В одну сторонуиспользовать ArrayList можно в сочетании с методами расширения Linq Distinct и Count (сначала для поиска всех различных символов, а затем для подсчета каждого из них):

foreach (var chr in data.Distinct())
{
    al.Add($"{chr} ({(int) chr}) {data.Count(c => c == chr)}");
}
0 голосов
/ 30 ноября 2018

Ваш алгоритм работает, но вы дублируете вывод при записи в файл внутри цикла, поэтому в результате вы видите дубликаты.Если вы переместите код за пределы цикла, все должно быть в порядке.

                foreach (var item in al)
                {
                    streamWriter.WriteLine(item);
                }

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

...