2017-10-15 6 views
-1

J'essaie de trier une liste de caractères et de les sortir par ordre de fréquence avec la fréquence associée. Par exemple, si l'utilisateur met en "beeeerr", je veux qu'il eteint "e fréq: 4, r Freq: 2, b Freq: 1"Java: Trier une liste de caractères par fréquence uniquement à l'aide de tableaux

Voici ce que j'ai jusqu'à présent:

public static void sort(String charInput) { 
    int frequency = 0; 
    char [] charArray = charInput.toCharArray(); 

    for (char charValue = ' '; charValue <= '~'; charValue++) { 
     frequency = 0; 
     for (int i = 0; i < charInput.length(); i++) { 
      char compare = charArray[i]; 
      //charInput.charAt(i) 
      if (compare == charValue) { 
       frequency += 1; 
      } 
     } 
     if (frequency > 0) { 
      System.out.println(charValue + " freq: " + frequency); 
     } 
    } 

} 

Le problème avec ceci est qu'il sort les fréquences dans l'ordre alphabétique. Je ne peux pas comprendre comment trier les sorties par leur fréquence. Je sais comment faire facilement cela avec des Hashmaps ou des Arraylists, mais je ne suis pas autorisé à les utiliser. Toute aide serait appréciée

Répondre

0
//128 is for ascii, change it to 256 for extended ascii 
//I assume all characters in the input are in ascii or extended ascii 
public void frequencySort(String s) { 
    int n = s.length(); 
    List<Character>[]res = new ArrayList[n+1]; 
    int []cnt = new int[128]; 
    char []ss = s.toCharArray(); 
    for(int i=0;i<n;++i){ 
     res[i+1]=new ArrayList<>(); 
     cnt[ss[i]]++; 
    } 
    for(int i=0;i<128;++i){ 
     if(cnt[i]!=0){ 
      res[cnt[i]].add((char)i); 
     } 
    } 

    for(int i=n;i>0;--i){ 
     if(!res[i].isEmpty()){ 
      for(char c:res[i]) 
      System.out.println("input has "+i+" " +c); 
     } 
    } 
} 
input has 4 e 
input has 2 r 
input has 1 b 
+0

Java utilise Unicode. La question a une gamme d'intérêt de '' à ''. Les 128 caractères auxquels vous faites référence sont le bloc [C0 Controls and Basic Latin] (http://www.unicode.org/charts/nameslist/index.html) et le 256 ajoute le bloc C1 Controls et Latin-1 Supplement. Mentionner ASCII provoque la confusion, et Extended ASCII-bien, c'est tellement imprécis qu'ils ne sont guère utiles. Dans le contexte d'Unicode, vous devez avoir voulu dire ISO 8859-1. Est-ce qu'il est beaucoup plus facile de gérer String, Character et char comme le décrit la [documentation Java] (https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html)? –

+0

Merci pour votre correction. Pour ce problème, vous pouvez simplement modifier 128 au nombre de caractères dans un ensemble Unicode. – taobupt

0

Avec Java 8 API Stream, vous pouvez habituellement effectuer ces opérations avec un liners:

str.chars().mapToObj(e->(char)e).collect(Collectors.toSet()).stream() 
     .collect(Collectors.toMap(ch -> ch, ch -> str.length() - str.replaceAll(ch.toString(), "").length())) 
     .entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) 
     .forEach(e -> System.out.println(e.getKey() + " freq: " + e.getValue()));