在打印已排序的字符串时删除重复项

时间:2017-10-24 00:52:21

标签: java arrays sorting duplicates

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

d freq:3

d freq:3

d freq:3

对于这个项目,我不允许使用任何内置 java排序函数(包括hashmaps)。关于如何阻止这个的任何建议?这是我的代码。谢谢!

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

4 个答案:

答案 0 :(得分:1)

您可以使用TreeMap<Character, Integer>来保存已排序的字符顺序以及计算字母频率。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

解决方案:在没有hashmap和排序的情况下更新:

ALGO: 1.创建26个字母的临时数组并输入频率计数.i.e

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

    }

    }

答案 3 :(得分:0)

您需要做的是Bucket Sort

简而言之,创建一个长度为26的int数组,它代表26个字符(让我们称之为&#34;计数器数组&#34;

循环你的字符串。对于遇到的每个字符,在计数器数组中递增相应的int。

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

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

Spoiler ahead:示例代码。如果您还没有尝试编写代码,请不要阅读

  

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