2016-12-16 2 views
0

Итак, я создаю дерево huffman, и мне нужно взять строку в качестве входных данных, а затем создать 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

Смежные вопросы