【问题标题】:Getting rid of duplicates while printing a sorted string在打印已排序的字符串时消除重复项
【发布时间】:2018-04-04 15:55:25
【问题描述】:

所以我有一个java程序,它从用户输入中获取一个字符串,对其进行排序,找到频率,并按字母顺序打印它。我唯一的问题是它还会打印重复项。因此,如果字母 d 在一个字符串中出现 3 次,它会打印如下:

d 频率:3

d 频率:3

d 频率:3

对于这个项目,我不允许使用任何内置 java 排序功能(包括哈希图)。关于如何阻止这种情况的任何建议?这是我的代码。谢谢!

     char[] charArray = userSort.toCharArray();
        char tempChar;
        for (int i = 0; i < charArray.length; i++) {
            for (int j = 0; j < charArray.length; j++) {
                if (charArray[i] < charArray[j]) {
                    tempChar = charArray[i];
                    charArray[i] = charArray[j];
                    charArray[j] = tempChar;
                }
            }
        }
        String sortedString = "";
        for (int i = 0; i < charArray.length; i++) {
            userSort += charArray[i];
        }
            System.out.println(sortedString + "\n");
            int counter;
            sortedString = "";

            for (int i = 0; i < charArray.length; i++) {
                counter = 0;

                for (int j = 0; j < charArray.length; j++) {
                    if (charArray[i] == charArray[j]) {
                        counter++;
                    }
                }
                if (!sortedString.contains("Char: " + charArray[i])) {
                    if (sortedString.equals("")) {
                        sortedString += " " + charArray[i] + " freq: " + counter + "\n";
                    } else {
                        sortedString += " " + charArray[i] + " freq: " + counter + "\n";
                    }
                }
            }
            System.out.println(sortedString);

【问题讨论】:

  • 如果您不想重复数据,请使用 Set
  • 如果要计算频率,请使用 Hashmap
  • 使用我两天前给你的解决方案,即代码最后一段中的located here。
  • 提示:桶排序
  • Hashmap 不是排序算法

标签: java arrays sorting duplicates


【解决方案1】:

您可以使用TreeMap&lt;Character, Integer&gt; 来保持排序的字符顺序和计算字母频率。

Map<Character, Integer> freqs = new TreeMap<>();
for (char c : charArray.length) {
    freqs.put(c, 1+freqs.getOrDefault(c, 0));
} 

您也不需要对输入字符串进行排序。 (特别是不使用冒泡排序)。迭代字符并添加/更新到地图将创建订单。

【讨论】:

  • 如果 OP 不能使用HashMap,我怀疑导师会允许TreeMap。
  • 是的 - 我在添加之前回答了。不过,只说不能使用内置排序方法。没有提到数据结构
【解决方案2】:

确保 i != 0。 比较 charArray [i] 和 charArray [i-1]。 如果它们不相等,则打印出结果。

【讨论】:

    【解决方案3】:

    解决方案:更新时不使用 hashmap 和排序:

    算法: 1.创建26个字母的临时数组并放置频率计数..即

    0-> a, 
    1-> b....
    

    2.迭代数组打印结果

    public static void countFrequency(){
    String user = "Harshal";
    user = user.toLowerCase();
        char ch[]= user.toCharArray();
    
        int arr[] = new int[26];
    
        for(char c : ch){
            arr[c-97]++;
        }
    
        for(int k=0;k<26;k++){
            if(arr[k]!=0){
                int val = k+97;
                System.out.println((char)val + " freq: " + arr[k]);
            }
    
        }
    
        }
    

    【讨论】:

    • 有帮助,但我无法使用排序功能或哈希图。
    【解决方案4】:

    你需要做的是桶排序

    简而言之,创建一个长度为 26 的 int 数组,表示 26 个字符(我们称其为“计数器数组”

    遍历你的字符串。对于遇到的每个字符,递增计数器数组中对应的 int。

    遍历输入字符串后,计数器数组将包含 26 个字符中每个字符的出现次数

    我相信其余的应该是直截了当的,你只需要遍历计数器数组并打印相应的输出

    前方剧透:示例代码。如果您还没有尝试编写代码,请不要阅读

    String input = "The quick brown fox jumps over a lazy dog"; int[] counter = new int[26]; for (char c : input.toLowerCase().toCharArray()) { if (c >= 'a' && c <= 'z') { counter[c-'a']++; } } for (int i = 0; i < counter.length; ++i) { System.out.println("" + (char)('a' + i) + " occurs " + counter[i] + " times"); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2020-03-25
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2020-12-13
      • 2015-02-24
      相关资源
      最近更新 更多