统计事件并删除字符串中的重复项

问题描述:

因此,我构建了一个huffman树,并且需要将字符串作为输入,然后创建2个数组,其中包含每个字母以及该字母在原始字符串中的出现次数,像这样:统计事件并删除字符串中的重复项

String s = "mississippi" 

应导致:

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

有关于这一点,并就如何解决这方面的例子很多很多的问题,尤其是这里的计算器,但我管理的唯一一个去工作是这样的:

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

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

+3

使用HashMap和尝试,如果它适合你的需求。 –

我会做这种方式

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