2016-12-16 9 views
0

私はハフマンツリーを構築していますが、文字列を入力として取り込み、それぞれの文字と元の文字列にその文字の出現数を含む2つの配列を作成する必要があります、次のように:出現をカウントして文字列から重複を取り除く

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

私がしたいことを行うには、より良い方法がありますか?

+3

HashMapを使用し、それはあなたの条件に合った場合にしようとそれを行います。 –

答えて

1

私はこの方法

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

関連する問題