Java笔试:记录不同字符串中不同字符的个数并将结果写入文件然后读取
统计字符串中不同字符的个数并将结果写入文件然后读取
解决思路:
使用之前删除字符串中重复元素的方法,在此基础上记录每次删除同一字符的次数,然后+1,得此字符在字符串中出现的次数。
去重剩下的字符则正好对应每种字符出现的次数
由于编写的比较粗糙,字符和各统计数据并未分开,代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class CountWord {
public static void main(String[] args) throws IOException {
String str = "yekmaakkccekymbvb";
int len = str.length();
char[] chr = str.toCharArray();// 将字符串转换成字符数组
int count1 = 0;// 记录每种字符删除次数
StringBuffer sbf = new StringBuffer();// 记录数字
StringBuffer sbfWord = new StringBuffer();// 记录各种不同的字符
char indexChr = '\u0000';
System.out.println(str);
// 从第一个开始寻找重复
for (int i = 0; i < len; i++) {
indexChr = chr[i];
for (int j = i + 1; j < len; j++) {
if (indexChr == chr[j]) {
count1 += 1;
// 删除重复
for (int k = j; k < len - 1; k++) {
chr[k] = chr[k + 1];
}
// 字符数组末尾置空
chr[len - 1] = '\u0000';
// 每去重一次,有效字符数组长度减一
len--;
j--;
}
}
// 每种字符去重次数加一得此字符出现次数
sbf.append(new Integer(count1 + 1));
// 记录置零,为记录下一个字符删除次数做准备
count1 = 0;
}
for (int i = 0; i < len; i++) {
sbfWord.append(chr[i]);
}
System.out.println(sbfWord);
System.out.println(sbf);
String msg = new String(sbfWord) + new String(sbf);
File file = new File("G:\\javaFileTest\\abc.txt");
File file2 = new File("G:\\javaFileTest\\msg.txt");
DataInputStream in = new DataInputStream(new FileInputStream(file));
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
System.out.println("向文件写入信息:G:\\javaFileTest\\msg.txt");
out.writeUTF(msg);
System.out.println("读取结果:");
String strNew = in.readUTF();
System.out.print(strNew);
FileInputStream fin = new FileInputStream(file2);
FileOutputStream fot = new FileOutputStream(file2);
InputStreamReader reader = new InputStreamReader(fin, "GBK");
OutputStreamWriter writer = new OutputStreamWriter(fot, "GBK");
BufferedReader bReader = new BufferedReader(reader);
BufferedWriter bWriter = new BufferedWriter(writer);
char[] chrNew = strNew.toCharArray();
System.out.println();
System.out.println(new String(chrNew));
bWriter.write(msg);
bWriter.flush();
System.out.println("写入成功!");
System.out.println("输出信息:");
System.out.println(bReader.readLine());
in.close();
out.close();
fin.close();
fot.close();
reader.close();
writer.close();
bReader.close();
bWriter.close();
}
}
该代码中使用了两种文件写入方法,第一种方法虽然简单,但是只对两端友好即:两端可见,中间乱码,所以存储在文件中是乱码的。但是,这并不影响文件的读取,程序读取后会正确显示:
另一种文件的写入与读取使用了转换流,在写入和读取时将字节数据转换成指定的字符集编码,但相对比较繁琐,同时使用了快速读写的方法。
效果如下:
第二种方法写入文件的效果:
第一种写入方法(文件会乱码,但不影响读取):