文章目录
一、要求描述
实现对一个输入字符串的字符数、字符出现的次数、字符出现的位置的统计。
并且能够写入txt文件保存,也可以加载这个保存的txt文件。
二、实现代码
csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace 字符串统计
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string outputStr = ""; // 输出字符串
private void btnCount_Click(object sender, EventArgs e)
{
string inputStr = rtbInput.Text; // 输入字符串
outputStr = "";
if (inputStr == string.Empty)
{
MessageBox.Show("输入字符串不能为空!");
return;
}
// 获取字符串中每个字符出现的次数,指出字符所在的位置
outputStr = CountCharInString(inputStr); // 调用函数
rtbOutput.Text = outputStr; // 显示统计结果
MessageBox.Show("统计完成!");
}
private void btnSave_Click(object sender, EventArgs e)
{
saveFileDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"; // 保存文件类型为txt
saveFileDialog1.RestoreDirectory = true; // 记录存储路径
if (outputStr == string.Empty)
{
MessageBox.Show("内容为空,不能保存!");
return;
}
if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// 获取打开的文件路径
string savePath = saveFileDialog1.FileName;
// 给打开的路径下写入txt文件
try
{
File.WriteAllText(savePath, outputStr, Encoding.Default);
MessageBox.Show("保存成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void btnLoad_Click(object sender, EventArgs e)
{
string loadStr = ""; // 读取的字符串
openFileDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string selectedPath = openFileDialog1.FileName;
loadStr = File.ReadAllText(selectedPath, Encoding.Default);
rtbOutput.Text = loadStr;
MessageBox.Show("加载成功!");
}
else
{
openFileDialog1.Dispose();
}
}
/// <summary>
/// 统计字符串中的字符、字符个数、字符位置
/// </summary>
/// <param name="inputStr">输入字符串</param>
/// <returns></returns>
private string CountCharInString(string inputStr)
{
string outputStr = "";
// 首先定义3个数据结构,分别装字符组、字符统计组、字符位置组
List<char> charName = new List<char>(); // 用来装不同的数组
List<int> charCount = new List<int>(); // 用来装不同字符的统计个数
List<List<int>> charLocation = new List<List<int>>(); // 用来同一个字符所在的位置
// 先将字符串转成字符串数组
char[] inputChar = inputStr.ToCharArray(0, inputStr.Length);
for (int i = 0; i < inputChar.Length; i++)
{
if (charName.Contains(inputChar[i]) == false)
{
charName.Add(inputChar[i]);
}
}
// 根据不同的字符,获取相同字符的个数、位置
for (int j = 0; j < charName.Count; j++)
{
int count = 0; // 统计当前字符的个数
List<int> location = new List<int>(); // 获取当前字符的位置
for (int i = 0; i < inputChar.Length; i++)
{
if (charName[j] == inputChar[i])
{
count++;
location.Add(i);
}
}
// 将获取的个数、位置加入整体的统计列表
charCount.Add(count);
charLocation.Add(location);
}
// 输出拼接字符串
for (int i = 0; i < charName.Count; i++)
{
outputStr = outputStr + charName[i] + ":" + charCount[i] + "次;";
for (int j = 0; j < charLocation[i].Count; j++)
{
outputStr = outputStr + (charLocation[i][j] + 1).ToString();
if (j != charLocation[i].Count - 1)
{
outputStr = outputStr +","; // 非末尾数值拼接逗号
}
}
outputStr = outputStr + "\n"; // 换行
}
// 清空列表,释放资源
charName.Clear();
charCount.Clear();
charLocation.Clear();
return outputStr;
}
}
}