java - 计算字符串中的出现次数并删除重复项

标签 java duplicates find-occurrences

所以我正在构建一棵哈夫曼树,我需要将一个字符串作为输入,然后创建两个数组,其中包含每个字母以及该字母在原始字符串中出现的次数,如下所示:

String s = "mississippi"

应该导致:

char[] charArr = {'m','i', 's', 'p'};
int[] count = {1,4,4,2};

关于这个问题有很多问题,也有很多关于如何解决这个问题的例子,特别是在 stackoverflow 上,但我唯一能解决的问题是:

private void findOccurences(String s) {
        List<Character> original = new ArrayList<Character>(s.length());
        List<Character> duplicateRemoved;

        for (int i = 0; i < s.length(); i++) {
            original.add(s.charAt(i));
        }
        duplicateRemoved = new ArrayList<Character>(original);

        // Remove duplicates from second list.
        Set<Character> hs = new HashSet<Character>();
        hs.addAll(duplicateRemoved);
        duplicateRemoved.clear();
        duplicateRemoved.addAll(hs);

        charFreqs = new int[duplicateRemoved.size()];
        charArr = new char[duplicateRemoved.size()];

        for (int i = 0; i < charArr.length; i++) {
            char c = duplicateRemoved.get(i);
            int count = Collections.frequency(original, c);
            charArr[i] = c;
            charFreqs[i] = count;
        }
    }

但是感觉很麻烦,而且还打乱了数组中字母的顺序。如果我使用它,我的结果数组如下:

char[] charArr = {'p','s', 'i', 'm'};

有没有更好的方法来做我想做的事?

最佳答案

我会这样做

String s = "mississippi";
List<String> original = Arrays.stream(s.split(""))
                     .collect(Collectors.toList());
List<String> duplicateRemoved = Arrays.stream(s.split(""))
                      .distinct()
                      .collect(Collectors.toList());
ArrayList<Integer> Occurrences = new ArrayList<>();
int counter = 1;

for (String aList : duplicateRemoved) {
    counter = (int) original.stream().filter(s1 -> s1.equals(aList)).count();
            Occurrences.add(counter);
        }
System.out.println(duplicateRemoved);
System.out.println(Occurrences);

和输出

enter image description here

关于java - 计算字符串中的出现次数并删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41189214/

相关文章:

java - 如何获取最频繁的项目

Java 泛型 - <K extends Middle> - K 是 Middle 的真正子代吗?

JAVA - 没有临时字符串、数组、Stringbuilder、子字符串的反向字符串

SQL 查找可能的重复项

比较子集的集合直到排列

c++ 将 vector 中出现 n 次的所有元素作为 vector 返回

java - 返回集群环境下的servlet

python - 在 python 列表中抓取唯一的元组,不管顺序如何

python - 如何获取 pandas 数据框中单词列表(子字符串)的出现次数?

c++ - 查找子字符串出现的次数