2014-09-06 190 views
0

我應該對字符數組進行排序並按降序排列。但應該很簡單,我沒有得到我想要的輸出。互聯網上的所有解決方案都告訴我Arrays.sort可以使用,但是我應該使用其他方法嗎?或者我忽略了什麼?Arrays.sort不按預期工作

public class mainClassTextFile { 

public static void main(String[] args) throws IOException { 
    FileReader fileReader = new FileReader("file.txt");  
    String fileContents = ""; 
    int i; 
    int loopcount = 0; 
    int count = 0; 

    while((i = fileReader.read())!=-1){ 
     char ch = (char)i; 
     fileContents = fileContents + ch; 
    } 
    char[] ch=fileContents.toCharArray(); 

    for(int n = 0; n < ch.length; n++) { 
     boolean addCharacter=true; 
     for(int t = 0; t < n; t++) { 
      if (ch[n] == (fileContents.charAt(t))) 
      addCharacter=false; 
      } 
      if (addCharacter) { 
       for(int j = 0; j < fileContents.length(); j++) { 
        if(ch[n]==fileContents.charAt(j)) 
        count=count+1; 
       } 
       Arrays.sort(ch); 
       System.out.print(ch[n] + ": "+(count)); 
       System.out.println(); 
       count=0; 
       loopcount++; 
      } 
    } 

} 
} 

的輸出被認爲是在文本,計數和分類的所有字符,然而,這是結果:

:3339

X:4

X:4

X:4

X:4

[:2

]:2

如果我// Arrays.sort(),然後我得到的文本文件中的所有字符計算正確,但他們既不是排序或降序排列!

+0

你爲什麼在循環中調用'Arrays.sort()'? – NPE 2014-09-06 13:05:54

+0

錯誤。我將它移動到我將fileContents傳遞給char數組的位置,但沒有區別 – user3628503 2014-09-06 13:09:35

+0

這整個代碼真的很奇怪。那個'while'循環的目的是什麼?如果你只是想讀取文件,而不是使用'BufferedReader'.'readLine()'。另外'if(addCharacter)'塊應該在'for(int t = 0; t charCounter'字段:'對於「ch」中的每個字符:charCounter.put(char,charCounter.get(char)+ 1)'。 – Tom 2014-09-06 13:31:47

回答

0

您的循環真的不列入道理給我,但如果你想從文件中讀取字符串,將其轉換爲charArray和排序它,你可以這樣來做

FileReader fileReader = new FileReader("yourFile.txt"); 
StringBuilder br = new StringBuilder(); 
while(true){ 
    int ch = fileReader.read(); 
    if(ch==-1) 
     break; 
    char chArr = (char)ch; 
    br.append(chArr); 
} 
char[] ch=br.toString().replaceAll("\\s+", "").toCharArray(); //removed all spaces 
System.out.println(Arrays.toString(ch)); 
Arrays.sort(ch); 
System.out.println("After sorting : "+Arrays.toString(ch)); // ascending order 
for(int i = ch.length - 1; i >= 0; i--) 
     System.out.println(arr[i]);       //descending order 
0

您的代碼有很多的錯誤,包括概念錯誤;所以不是進入詳細說明它是如何被糾正,我提交代碼的工作和我試圖讓類似於你:

public static void main(String[] args) throws IOException { 
    final String fileContents; 
    try (Scanner sc = new Scanner(new File("file.txt"))) { 
    fileContents = sc.useDelimiter("\\Z").next(); 
    } 
    final char[] ch = fileContents.toCharArray(); 
    Arrays.sort(ch); 
    int prevChar = -1, count = 0; 
    for (int i = 0; i < ch.length; i++) { 
    if (ch[i] != prevChar) { 
     if (count > 0) System.out.println((char)prevChar + ": "+count); 
     count = 1; 
     prevChar = ch[i]; 
    } else count++; 
    } 
    if (count > 0) System.out.println((char)prevChar + ": "+count); 
} 

注意,我冒昧地徹底改變常規的加載整個文件作爲一個字符串。這是因爲我認爲文件閱讀是一個側面關注點。

循環的工作原理是遍歷排序後的數組,並在每次遇到不同於前一個字符的字符時發出計數。最後我們有一個重複的代碼行來打印最終的字符。