仅当数组列表尚不存在时才将其添加到数组列表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅当数组列表尚不存在时才将其添加到数组列表中相关的知识,希望对你有一定的参考价值。

下面的代码应该读取文本文件并计算文件中的所有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();
    }
}

代码编译并运行完全正常,但输出文件不正确。它正在添加已经过审核的信件。我添加了一个带有输出文件的图像,显​​示它正在创建的输出错误。 - > enter image description here

如何检查数组列表中是否已存在某个字符?我使用的方式不能正常工作,我已经在这几周工作,但没有成功。我已经尝试使用调试器但这个问题不会显示在那里,因为代码仍然运行并正确编译。

答案

ArrayList不适合这项任务,实际上ArrayLists不再使用了。如果有人告诉您必须使用ArrayList执行此操作

字典对于这些数据来说是一个更好的容器。您可以将字符用作键,将计数用作值。

这是一种方法:

var inputPath = @"c:	emp	emp.txt";
var outputPath = @"c:	emp
esults.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扩展方法DistinctCount(首先查找所有不同的字符,然后查看每个字符的计数):

foreach (var chr in data.Distinct())
{
    al.Add($"{chr} ({(int) chr}) {data.Count(c => c == chr)}");
}
另一答案

您的算法有效,但在写入循环内的文件时,您正在复制输出,这就是您在结果中看到重复的原因。如果你把代码移到循环之外,它应该没问题。

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

我建议你的算法在正确的情况下表现不佳,你做了太多不必要的比较,也许你应该阅读/检查更多关于使用词典来存储结果。

以上是关于仅当数组列表尚不存在时才将其添加到数组列表中的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中

PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组

仅当输入为数组时才将类调用为数组

仅当表中不存在两个 id 的组合时才将值插入表中

仅当记录不存在时才将 SQL 插入表中[重复]

R:仅当同一列中的两行中的值为真时才将值添加到 [row,column]