while循环返回随机数而不是字符串

时间:2019-05-15 17:33:49

标签: java

我正在创建一个应用程序,该应用程序从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

2 个答案:

答案 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”。

您可以对每个单个字符执行此操作,从而创建包含数字和*的结果输出文件。

您需要完全重写代码。这是我建议的正确实施方法:

  1. 将输入文件完整读取为一个String。

  2. 遍历该String中的字符以查找最常出现的字符。

  3. 用星号替换字符串中的该字符。

  4. 将结果字符串写入您的输出文件。