【问题标题】:Arrays.sort is not working as intendedArrays.sort 未按预期工作
【发布时间】:2014-10-31 06:34:09
【问题描述】:

我应该对一个 char 数组进行排序并按降序打印。应该很简单,但是,我没有得到我想要的输出。互联网上的所有解决方案都告诉我 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() ,那么我会正确计算文本文件中的所有字符,但是它们既没有排序也没有降序!

【问题讨论】:

  • 你为什么要循环调用Arrays.sort()
  • 错误。我将它移到我将 fileContents 传递给 char 数组的位置,但没有区别
  • 整个代码真的很奇怪。 while 循环的目的是什么?如果您只想读取文件,请改用BufferedReader.readLine()if (addCharacter) 块也应该在 for(int t = 0; t &lt; n; t++) 循环之外。您想先测试,然后再添加角色。如果您使用地图来存储当前计数器会容易得多。将是具有以下循环(伪代码)的 Map&lt;Character, Integer&gt; charCounter 字段:for every character in "ch": charCounter.put(char, charCounter.get(char) + 1).
  • 嘿!这帮助很大,非常感谢。

标签: java arrays sorting char


【解决方案1】:

你的 for 循环对我来说真的没有意义,但如果你想从文件中读取字符串,将其转换为 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

【讨论】:

    【解决方案2】:

    您的代码有很多错误,包括概念性错误;因此,我没有详细解释如何纠正它,而是提交了有效的代码,并且我试图使它们与您的代码相似:

    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);
    }
    

    请注意,我冒昧地完全更改了将整个文件作为字符串加载的例程。这是因为我在这里将文件读取视为一个侧面问题。

    循环通过遍历排序数组并在每次遇到与前一个字符不同的字符时发出计数来工作。最后,我们有一行重复的代码打印最后一个字符。

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2022-01-24
      • 2015-05-11
      • 2020-05-15
      • 2018-02-12
      • 2014-01-20
      • 2015-01-13
      • 2013-08-01
      • 2019-04-13
      相关资源
      最近更新 更多