compareTo warum geht es nicht?

tribor

Neues Mitglied
Hallo ich habe ein Problem. Die Aufgabe lautet wiefolgt:

Es ist ein Programm vorgegeben, das zuerst Worte in eine Liste einfügt, dann die Worte in der Liste nach der Anzahl ihrer Vokale aufsteigend sortieren soll und zuletzt den sortierten Inhalt der Liste auf dem Bildschirm ausgibt.
Leider ist das Programm unvollständig.
Erweitern Sie das vorgegebene Programm um eine Klasse Wort, die ein Wort darstellen soll. Die
Klasse Wort soll das Interface Comparable implementieren, damit man Objekte der Klasse Wort
vergleichen und sortieren kann. Beachten Sie bei der Implementierung der Methode public int
compareTo(Wort o), dass die Objekte der Länge nach aufsteigend sortiert werden sollen. Des
Weiteren muss die Klasse Wort die Methode public String toString() überschreiben, damit
die Ausgabe des Listeninhaltes auf dem Bildschirm funktioniert. Weitere notwendige Attribute und
Methoden (bzw. Konstruktoren) können Sie in die Klasse Wort einfügen.
das ist der gegebene Code:
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class WoerterMain {
  public static void main(String[] args) {
    List<Wort> liste = new ArrayList<Wort>();
    liste.add(new Wort("Diese"));
    liste.add(new Wort("Worte"));
    liste.add(new Wort("sollen"));
    liste.add(new Wort("der"));
    liste.add(new Wort("Laenge"));
    liste.add(new Wort("nach"));
    liste.add(new Wort("sortiert"));
    liste.add(new Wort("werden."));
    Collections.sort(liste);
    System.out.println(liste);
  }
}

Das ist die angesprochene Klasse Wort die ich selber geschrieben habe:

Java:
import java.util.Collections;
import java.util.List;
public class Wort implements Comparable<Wort>{
	public String vergleichswort;
	public int vergleich;
	public int zurueck;
	public Wort(String Wort) {
		this.vergleichswort = Wort;
	}
	
	public  int compareTo(Wort o){		
		vergleich=0;	
			for(int i = 0; i < vergleichswort.length(); i++) {
		    vergleich=0;	
			char c = vergleichswort.charAt(i);
			if (c=='a')vergleich+=1;
			else if (c=='e') vergleich+=1;
			else if (c=='i') vergleich+=1;
			else if (c=='o') vergleich+=1;
			else if (c=='u') vergleich+=1;
			else if (c=='A') vergleich+=1;
			else if (c=='E') vergleich+=1;
			else if (c=='I') vergleich+=1;
			else if (c=='O') vergleich+=1;
			else if (c=='U') vergleich+=1;
			}
			if (o.vergleich < this.vergleich){
			return zurueck=1; } else
			if (o.vergleich > this.vergleich){
			return zurueck=-1;}
			if (o.vergleich == this.vergleich){
			
			return zurueck=0;}
			return zurueck;
	}
	 public String toString(){
		return this.vergleichswort;
		
	}
	}

als ausgabe bekomme ich:
[sollen, der, nach, sortiert, werden., Worte, Diese, Laenge]


statt:
[der, nach, Worte, sollen, werden., Laenge, Diese, sortiert]

wo liegt mein Fehler? Brauche schnelle Hilfe, denn abgabe ist in 30 minuten und ich sitze schon fast 4 Stunden erfolglos an dieser Aufgabe...
 
Du musst auch noch die Anzahl der Vokale von dem "vergleichswort" von o ermitteln und dann eben Anzahl Vokale von this.vergleichswort mit o.vergleichswort vergleichen

Java:
    public int compareTo(Wort o) {
	int vergleich = 0, vergleich2 = 0;
	for (int i = 0; i < vergleichswort.length(); i++) {
	    char c = vergleichswort.charAt(i);
	    if (c == 'a')
		vergleich += 1;
	    else if (c == 'e')
		vergleich += 1;
	    else if (c == 'i')
		vergleich += 1;
	    else if (c == 'o')
		vergleich += 1;
	    else if (c == 'u')
		vergleich += 1;
	    else if (c == 'A')
		vergleich += 1;
	    else if (c == 'E')
		vergleich += 1;
	    else if (c == 'I')
		vergleich += 1;
	    else if (c == 'O')
		vergleich += 1;
	    else if (c == 'U')
		vergleich += 1;
	}
	for (int i = 0; i < o.vergleichswort.length(); i++) {
	    char c = o.vergleichswort.charAt(i);
	    if (c == 'a')
		vergleich2 += 1;
	    else if (c == 'e')
		vergleich2 += 1;
	    else if (c == 'i')
		vergleich2 += 1;
	    else if (c == 'o')
		vergleich2 += 1;
	    else if (c == 'u')
		vergleich2 += 1;
	    else if (c == 'A')
		vergleich2 += 1;
	    else if (c == 'E')
		vergleich2 += 1;
	    else if (c == 'I')
		vergleich2 += 1;
	    else if (c == 'O')
		vergleich2 += 1;
	    else if (c == 'U')
		vergleich2 += 1;
	}
	return vergleich - vergleich2;
    }

Wobei das natürlich nicht so schön aussieht 🙂
Man kann sich auch mehrere Methoden schreiben 😀

Vllt irgendiwe so dann:
Java:
    public int compareTo(Wort o) {
	return this.countVowels() - o.countVowels();
    }

    private int countVowels() {
	int vowels = 0;
	for (char c : this.vergleichswort.toCharArray()) {
	    if (isVowel(c))
		vowels++;
	}
	return vowels;
    }

    private boolean isVowel(char c) {
	switch (c) {
	case 'a':
	case 'A':
	case 'e':
	case 'E':
	case 'o':
	case 'O':
	case 'u':
	case 'U':
	case 'i':
	case 'I':
	    return true;
	default:
	    return false;
	}
    }

Wozu jetzt die beiden Objektvariablen vergleich und zurueck dienen - ???:L
 
Java:
	switch (c) {
	case 'a':
	case 'A':
	case 'e':
	case 'E':
	case 'o':
	case 'O':
	case 'u':
	case 'U':
	case 'i':
	case 'I':
	    return true;
	default:
	    return false;
	}
    }
Sieht vielleicht schon etwas hübscher aus, als die monströsität davor, allerdings hat's asymptotisch immer noch lineare laufzeit in der anzahl der interessanten Buchstaben.

=> Hashen!
Java:
import java.util.*;
import static java.util.Arrays.*;
import static java.lang.System.*;

public class VocalCounting {
	
	private static final Set<Character> VOCALS = new HashSet<Character>();
	static { 
		String s = "aeiouäöü";
		for(char c:s.toCharArray()) VOCALS.add(c);
		for(char c:s.toUpperCase().toCharArray()) VOCALS.add(c);
	}
	
	private static int countChars(String s, Set<Character> interestingChars){
		int cnt = 0;
		for(char c:s.toCharArray()) if(interestingChars.contains(c)) cnt++;
		return cnt;
	}
	
	private static int countVocals(String s){
		return countChars(s,VOCALS);
	}
	
	public static void main(String..._){
		List<String> list = new ArrayList<String>(asList("Hallo","Ärger","Umweltschutzorganisation","Ähm","Ahaaa!","rtzfghbnm","ioioauoÜäÖü"));
		Collections.sort(list,new Comparator<String>(){
			@Override
			public int compare(String a, String b) {
				return countVocals(a)-countVocals(b);
			}
		});
		out.println("Vocals: "+VOCALS);
		out.println("Sorted: "+list);
	}
}
Bemerkung: selbstverständlich wird die version mit den zwanzig if-elses immer noch schneller laufen, als die initialisierung der HashMap, aber es geht ja um's prinzip & verallgemeinerung^^
 

Neue Themen


Zurück
Oben