saftmeister
Nutze den Saft!
Man kann auch enum's mit einem Comparator vergleichen, ist ja nur ein Interface:
EDIT: Bisschen Fehlerbehandlung und Javadoc-Kommentare eingefügt
Java:
package de.tutorials.work;
public enum Farbe {
ROT("Rot"), BLAU("Blau"), GRUEN("Grün"), WEISS("Weiss"), GELB("Gelb"), SCHWARZ("Schwarz"), VIOLET("Violet");
private String farbe;
private Farbe(final String farbe) {
this.farbe = farbe;
}
public String toString() {
return this.farbe;
}
}
Java:
package de.tutorials.work;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Worker {
/**
* Comparator für das Sortieren nach Farb-Wert innerhalb des enum
*/
private class FarbWertSortierer implements Comparator<Farbe> {
@Override
public int compare(Farbe o1, Farbe o2) {
return o1.ordinal() < o2.ordinal() ? -1 : (o1.ordinal() > o2.ordinal() ? 1 : 0);
}
}
/**
* Comparator für das Sortieren nach Farb-Namen (Buchstaben aufsteigend)
*/
private class FarbNameSortierer implements Comparator<Farbe> {
@Override
public int compare(Farbe o1, Farbe o2) {
return o1.toString().compareTo(o2.toString());
}
}
/**
* Den Farb-String nach Farben auftrennen
*
* @param farbMischung
* Die Zeichenkette, welche die Farben enthält
* @return List der identifizierten Farben
*/
private List<Farbe> scanneFarben(final String farbMischung) {
String tempFarbString = new String(farbMischung);
List<Farbe> farben = new ArrayList<Farbe>();
while (tempFarbString.length() > 0) {
boolean gefunden = false;
for (Farbe f : Farbe.values()) {
if (tempFarbString.startsWith(f.toString())) {
farben.add(f);
tempFarbString = tempFarbString.replaceFirst(f.toString(), "").trim();
gefunden = true;
break;
}
}
if (!gefunden) {
throw new RuntimeException("Etwas stimmt mit der Eingabe " + tempFarbString
+ " nicht, es konnte keine gültige Farbe am Anfang der Zeichenkette gefunden werden");
}
}
return farben;
}
/**
* Sortiere die Farb-Liste anhand des angebenen Comparators
*
* @param farben
* Liste der zu sortierenden Farben
* @param c
* Der Comparator
* @return sortierte Liste der Farben
*/
private List<Farbe> sortiereFarben(final List<Farbe> farben, Comparator<Farbe> c) {
List<Farbe> ergebnis = new ArrayList<Farbe>();
ergebnis.addAll(farben);
Collections.sort(ergebnis, c);
return ergebnis;
}
/**
* Sortiere die Liste der Farben anhand ihres Werts innerhalb der
* Enumeration
*
* @param farben
* Liste der zu sortierenden Farben
* @return sortierte Liste der Farben
*/
private List<Farbe> sortiereNachWert(final List<Farbe> farben) {
return sortiereFarben(farben, new FarbWertSortierer());
}
/**
* Sortiere die Liste der Farben anhand ihres Namens
*
* @param farben
* Liste der zu sortierenden Farben
* @return sortierte Liste der Farben
*/
private List<Farbe> sortiereNachNamen(final List<Farbe> farben) {
return sortiereFarben(farben, new FarbNameSortierer());
}
/**
* Füge die Liste der Farben zu einer Zeichenkette zusammen
*
* @param farben
* Liste der zu kombinierenden Farben
* @return Zeichenkette die alle Farben in der Reihenfolge der Liste enthält
*/
private String kombiniereFarben(final List<Farbe> farben) {
String ergebnis = "";
for (Farbe f : farben) {
ergebnis = ergebnis + f.toString();
}
return ergebnis;
}
/**
* Main-Funktion
*
* @param args
*/
public static void main(final String[] args) {
Worker worker = new Worker();
String s1 = "GrünGrünRotWeissVioletSchwarz";
String s2 = "GrünWeissWeissVioletBlauGelbWeissRotGrün";
System.out.println("Farbe 1 unsortiert " + s1);
System.out.println(
"Farbe 1 nach Namen " + worker.kombiniereFarben(worker.sortiereNachNamen(worker.scanneFarben(s1))));
System.out.println(
"Farbe 1 nach Wert " + worker.kombiniereFarben(worker.sortiereNachWert(worker.scanneFarben(s1))));
System.out.println(System.lineSeparator());
System.out.println("Farbe 2 unsortiert " + s2);
System.out.println(
"Farbe 2 nach Namen " + worker.kombiniereFarben(worker.sortiereNachNamen(worker.scanneFarben(s2))));
System.out.println(
"Farbe 2 nach Wert " + worker.kombiniereFarben(worker.sortiereNachWert(worker.scanneFarben(s2))));
System.out.println(System.lineSeparator());
}
}
EDIT: Bisschen Fehlerbehandlung und Javadoc-Kommentare eingefügt
Zuletzt bearbeitet: