我正在创建一个应用程序,该应用程序从input.txt获取输入并查找最常用的字符,并将其替换为*符号。但是output.txt用*显示随机数。所以我不知道出了什么问题。
import java.io.*;
public class StringTest1 {
public static void main(String[]args)
throws IOException{
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
String sen = Integer.toString(c);
String str = sen.toLowerCase();
int[] freq = new int[str.length()];
char maxChar = str.charAt(0);
int i, j, max;
//Converts given string into character array
char string[] = str.toCharArray();
//Count each word in given string and store in array freq
for(i = 0; i < string.length; i++) {
freq[i] = 1;
for(j = i+1; j < string.length; j++) {
if(string[i] == string[j] && string[i] != ' ' && string[i] != '0') {
freq[i]++;
//Set string[j] to 0 to avoid printing visited character
string[j] = '0';
}
}
}
//Determine maximum occurring characters
max = freq[0];
for(i = 0; i <freq.length; i++) {
//If max is less than frequency of a character
//then, store frequency in max and corresponding character in maxChar
if(max < freq[i]) {
max = freq[i];
maxChar = string[i];
}
}
String maxLetter = Character.toString(maxChar);
String line = str.replaceAll(maxLetter, "*");
char[]ch = line.toCharArray();
out.write(line);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
*4*7**8*7*2*4*8***7*2*4*3*0*2*3*0***4**8*08*0***6**5*0*3**6**4**7**6**5*2*2*05*8*0***4**0*7**6*0**2*06*7**8*7*2*7*0**8*2*3*0***4**8*05***0***5*0*3**2**4*05**0*03*2*4*3*0*2*4*5*6*5*0*4*04**4*0**7*00**5*2*4*7*6*7*2*7*****0****7**4**4*0***0**6*2*0**4****03**4*7*09*09*05**0*03*0*06*5**8*5*2*2*7*00********2*2*4*00*8***2*06**5*02*0**5**2**4*05**0*03*2*4**5*02*2*06*00*8***2*04*05*8*0***4**0*7**6*0**0
但是我希望它是单词,大多数重复字符更改为*。
原始文本(input.txt)
Java JDBC JSP Servlets
Struts Hibernate java Web Services
Spring JSF JAVA
Threads JaVa Concurrent Programming
jAvA Hadoop Jdbc jsf
spring Jsf jdbc hibernate
答案 0 :(得分:2)
in.read()
返回单个 character ,即一个char
值,但作为一个int
值来支持额外的-1
来指示结束流。
Integer.toString(c)
然后将该数字值转换为字符串。
第一个字符J
的数字值为74
。
将Integer.toString(c)
替换为Character.toString((char) c)
答案 1 :(得分:0)
您需要一个rubber duck,并且需要阅读以下内容:What is a debugger and how can it help me diagnose problems?
您正在使用(c = in.read()
分别读取每个字符。
然后,您将该字符的整数(ASCII)值转换为字符串,例如,将具有ASCII值74的第一个字符J
转换为字符串“ 74”。
然后,在该字符串“ 74”上进行一些复杂的处理,并用'*'替换'7',得到“ * 4”。
您可以对每个单个字符执行此操作,从而创建包含数字和*的结果输出文件。
您需要完全重写代码。这是我建议的正确实施方法:
将输入文件完整读取为一个String。
遍历该String中的字符以查找最常出现的字符。
用星号替换字符串中的该字符。
将结果字符串写入您的输出文件。