2016-07-23 61 views
0

我想写计算从一个文件中的行数和字符数的代码,然后排序任何字符(包括空格和逗号)排序字符

我想出。

import java.io.BufferedReader; 


     File file1 = new File("C:/input.txt"); 
     BufferedReader in = new BufferedReader(new FileReader(file1)); 

     int nextChar; 
     char ch; 

     int[] count = new int[1000]; 





     in.close(); 
    } 
} 

在此先感谢!

+0

编辑问题以包含程序的当前输出,以便我们可以帮助更好地理解问题。如果你不能这样做,那么解释编译器错误发生的地方 –

回答

1

好的,所以这里棘手的事情是如何去排序原始类型为int降序排列数组?那么,这个网站上有很多关于Arrays.sort(array, Collections.reverseOrder());的帖子,但是这只能用于对象数组,而不是像int这样的基本类型。因此,最好的方法是使用内置的Arrays方法以升序对数组进行排序,然后遍历整个数组以反转数组中的元素。所以,你应该考虑把这个代码片段对你的程序的结束,

Arrays.sort(count);//sort in ascending order 
for(int i = 0; i < count.length; i++){ //reversing the order of the array 
    int k = count[i]; //swapping the i-th element with the i-th to last element 
    count[i] = count[count.length - 1 - i]; 
    count[count.length - 1 - i] = k; 
} 

个人而言,我建议把上面的代码for循环之前,

for (i = 0; i < 26; i++) { 

    System.out.printf("%c : %d", i + 'A', count[i]); 

    System.out.println(""); 
} 
1

你可以使用地图然后使用自写比较器(我从this线程窃取代码)排序,这样您就不必预先定义要计数的字符(就像使用数组一样)。

这将是这个样子:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class CountCharsFromFile { 
    static BufferedReader b; 

    public static void main(String[] args) { 

     try { 
      FileReader fr = new FileReader("C:\\test.txt"); 
      b = new BufferedReader(fr); 

      Map<String, Double> count = new HashMap<String,Double>(); 
      ValueComparator bvc = new ValueComparator(count); 
      TreeMap<String, Double> sorted_map = new TreeMap<String, Double>(bvc); 

      int totalChars = 0; 
      int totalWords = 0; 

      String currentLine; 

      while ((currentLine = b.readLine()) != null){ 
       for (int i = 0; i < currentLine.length(); i++) { 

        //Char count: 
        totalChars += 1; 

        //Adding all chars to the Map: 
        char currentChar = Character.toLowerCase(currentLine.charAt(i)); 

        if (! count.containsKey(String.valueOf(currentChar))){ 
         count.put(String.valueOf(currentChar), 1.0); 
        }else{ 
         count.put(String.valueOf(currentChar), count.get(String.valueOf(currentChar)) + 1); 
        } 

       } 

       //Counting words: 

       String[] currentLineSplit= currentLine.split("\\s+"); 

       for (String string : currentLineSplit) { 
        totalWords += 1; 
       } 

      } 

      sorted_map.putAll(count); 

      //Output: 
      System.out.println("Words: " + totalWords); 
      System.out.println("Chars: " + totalChars); 
      System.out.println(sorted_map.toString()); 


     } catch (FileNotFoundException e) { 
      System.err.println("Error, file not found!"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.err.println("Error reading file!"); 
      e.printStackTrace(); 
     }finally{ 
      try { 
       b.close(); 
      } catch (IOException e) { 
       System.err.println("Couldn't close the BufferedReader!"); 
       e.printStackTrace(); 
      } 

     } 

    } 
} 




//comparator class: 

class ValueComparator implements Comparator<String> { 
    Map<String, Double> base; 

    public ValueComparator(Map<String, Double> base) { 
     this.base = base; 
    } 

    // Note: this comparator imposes orderings that are inconsistent with 
    // equals. 
    public int compare(String a, String b) { 
     if (base.get(a) >= base.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } // returning 0 would merge keys 
    } 
} 

输出看起来是这样的:

Words: 9 
Chars: 59 
{ =16.0, h=7.0, i=5.0, r=4.0, c=4.0, �=3.0, s=3.0, o=3.0, l=3.0, f=3.0, ,=2.0, w=1.0, u=1.0, n=1.0, m=1.0, b=1.0, a=1.0} 

“sorted_map.toString()” 的输出是不是真的很好,所以我写了一个快速输出方式:

static void output(TreeMap<String, Double> sm) { 

     String map = sm.toString(); 

     if (map.length() > 2) { //If the map is empty it looks like this: {} 

      map = map.substring(1, map.length() - 1); //cutting the leading and closing { } 

      String[] charCount = map.split(", "); //Splitting 

      //And then formatting: 
      for (String string : charCount) { 
       if (string.charAt(0) == ' ') { 

        string = string.substring(1, string.length() - 2); 
        string = " " + string.substring(0, 1) + " " + string.substring(1, string.length()); 
        System.out.println("SPACE" + string); 

       } else { 

        string = string.substring(0, string.length() - 2); 
        string = string.substring(0, 1) + " " + string.substring(1, 2) + " " 
          + string.substring(2, string.length()); 
        System.out.println(string); 
       } 
      } 

     } 

    } 

你打电话,像这样:

System.out.println("Words: " + totalWords); 
    System.out.println("Chars: " + totalChars); 
    System.out.println(); 
    //System.out.println(sorted_map.toString()); <--- old 
    output(sorted_map); 

和输出看起来是这样的:

Words: 9 
Chars: 60 

SPACE = 8 
R = 6 
T = 5 
E = 5 
A = 5 
N = 3 
U = 2 
O = 2 
M = 2 
L = 2 
I = 2 
H = 2 
. = 1 
Z = 1 
Y = 1 
X = 1 
W = 1 
V = 1 
S = 1 
Q = 1 
P = 1 
K = 1 
J = 1 
G = 1 
F = 1 
D = 1 
C = 1 
B = 1 

而且你去那里,它得到了一点点凌乱(比较打破“TreeMap.get”的方法,所以我不得不使用建立一个解决方法子串),但我希望这会对你有所帮助:)

+0

非常感谢你。我会在这一行尝试这个 – David

+0

ValueComparator bvc = new ValueComparator(count)。 theres错误。它说非statice变量这不能从静态上下文引用 – David

+0

好吧,我只是修复了代码中的2个小错误,但我真的不知道它为什么会告诉你某些东西不是静态的......如果你声明它在main()方法内部,它应该始终是静态的。我只是复制粘贴代码,它对我来说工作正常 –