zeichen eines String mit der kleinsten Frequenz zurückgeben

bradig

Aktives Mitglied
Hallo,
ich habe ein kleines Problem.
Beim Testen habe ich festgestellt,dass meine Aufgabe nicht zu 100 prozent richtig ist.
ich weiß aber nicht,wo der Fehler liegt.

getCharacterWithMinimalFrequency("chhddajjekkb") gibt c statt a zurück.

a ist ja das kleinste Zeichnen mit der kleinsten Frequenz ,nicht c.
Bitte um Hilfe

Herzlich

Bradig


Java:
  /**
  * Gibt das Zeichen der gegebenen Zeichenkette zurück, dass am seltensten darin vorkommt.
  * Sollte es mehrere Zeichen mit minimaler Häufigkeit in der Zeichenkette geben, so wird
  * davon das Zeichen mit dem kleinsten Zahlenwert zurückgegeben
  * (Tipp: Zusammenhang char <-> int).
  * Falls es kein solches Zeichen gibt, wird eine {@link IllegalArgumentException} ausgelöst.
  *
  * Beispiel:
  * Gegeben die Zeichenkette "AABBCCabbccz"
  * Das gesuchte Ergebnis lautet hier: 'a'
  * (da 'a' genau wie 'z' nur einmal vorkommt, das 'a' aber einem kleineren Zahlenwert
  * als dem Zahlenwert von 'z' entspricht)
  *
  * @param input die Zeichenkette, deren Zeichen mit mininmaler Häufigkeit gesucht wird
  * @return das Zeichen mit dem kleinsten Zahlenwert, das am seltensten in der gegebenen
  * Zeichenkette vorkommt
  */
final public static char getCharacterWithMinimalFrequency(final String input) {
        if(input==null || input.length()==0){
            throw new IllegalArgumentException();
        }

        int min=Integer.MAX_VALUE;
        char c='0';
      
     
        for(int i=0;i<input.length();i++){
            int freq=getFrequency(input,input.charAt(i));
            if(freq<min ){
                min=freq;
                c=input.charAt(i);
               
            }
        }
        return c;

    }

    final public static int getFrequency(String input,char a){
        int s=0;
        for(int i=0;i<input.length();i++){
            if(input.charAt(i)==a){
                s++;
            }
        }
        return s;

    }
}
 
Java:
 final public static char getCharacterWithMinimalFrequency(final String input) {
        if(input==null || input.length()==0){
            throw new IllegalArgumentException();
        }

        int min=Integer.MAX_VALUE;
        char cMin=Character.MAX_VALUE;
      
     
        for(int i=0;i<input.length();i++){
            int freq=getFrequency(input,input.charAt(i));
            if(input.charAt(i)<cMin && freq<=min ){
                min=freq;
                cMin=input.charAt(i);
               
            }
        }
        return cMin;

    }

    final public static int getFrequency(String input,char a){
        int s=0;
        for(int i=0;i<input.length();i++){
            if(input.charAt(i)==a){
                s++;
            }
        }
        return s;

    }
funktioniert immer noch nicht
 
ich habe vieles ausprobiert ,aber es funktioniert immer noch nicht richtig.
hat noch irgendwer eine Ahnung ,wie ich mein Code verbessern kann,damit es richtig fünktioniert?

herzlich
 
Ja, dein if passend umstellen.
Schreib einfach mal mit Worten auf, wann ein Buchstabe der mit der kleinsten Frequenz ist
 
Warum befolgst du nicht den Rat von Brown und schreibst es einfach mal auf. Dann sieht man es sofort.

Wenn die Frequenz kleiner ist als die alte minFreq oder die Frequenz = der alten minFreq und der neue Buchstabe kleiner als der alte minBuchstabe...
 
Also, es gibt die Fälle:
- kleinere freq -> ändere min und cMin
- gleiche freq, und cMin kleiner -> ändere cMin (freq ist ja schon gleich)
Das musst du nur noch in Code "übersetzen".
 
es funktioniert jetzt .danke @Thallius und @mrBrown und @Cromewell

Java:
final public static char getCharacterWithMinimalFrequency(final String input) {
        if(input==null || input.length()==0){
            throw new IllegalArgumentException();
        }

        int min=Integer.MAX_VALUE;
        char c='0';

      
     
        for(int i=0;i<input.length();i++){
            int freq=getFrequency(input,input.charAt(i));
            if(freq<min){
                min=freq;
                c=input.charAt(i);
            }
            else if(freq==min &&input.charAt(i)<c){
                min=freq;
                c=input.charAt(i);
            }

        }
        return c;
    }

    final public static int getFrequency(String input,char a){
        int s=0;
        for(int i=0;i<input.length();i++){
            if(input.charAt(i)==a){
                s++;
            }
        }
        return s;

    }
 
Zuletzt bearbeitet:
es funktioniert auf jeden Fall schon.
kleine Frage:
weiß einer von euch wie man die NullPointerExceptions,die manchmal beim Testen auftreten , loswerden kann.
Beispiel:
if(a==null){
throw new IllegalArgumentException();
}
und beim Testen gebe ich folgendes ein :
methode(null) statt IllegalArgumentException zu bekommen ,bekomme ich NullPointerException.
 
So völlig ohne Kontext kann man da nichts zu sagen.
Wenn das if als erster Teil der Methode steht, kann in der Methode aber keine NPE weil a null ist geworfen werden.
 

Zurück
Oben