# Comparator mit Bubblesort



## erdochef (5. Nov 2015)

Hallo,

ich habe hier eine Aufgabe und weiß nicht genau wie ich beginnen soll.

*Aufgabe:*
Schreiben Sie ein Klasse ArraySortierer mit dem Attribut String[] data und den folgenden vier Methoden:

```
public arraysortierer(ArrayList<String> data)

public void criteriaSort(int criteria)

public void bubble(String[] a, Comparator<String> c) {
for (int i = 0; i< a.length; i++)
      for (int j = 1; j< a.length-i; j++) {
           if (c.compare(a[j-1], a[j]) > 0 )
               swap(a, j-1, j);
}
}
private void swap(String[] a, int pos1, int pos2){
String hlp = a[pos1];
a[pos1] = a[pos2];
a[pos2] = hlp;
}
```

Bei Aufruf von criteriaSort(1) soll nach der Länge der Zeichenkette aufsteigend sortiert werden.
Bei Aufruf von criteriaSort(2) soll alphabetisch absteigend sortiert werden.

Implementieren Sie die Methoden arraySortierer und criteriaSort sowie die notwendigen Komparatoren. Verwenden Sie den gegeben bubbleSort-Algorithmus aus der Klasse ArraySortierer.

So das ist die Aufgabe, leider weiß ich nicht so recht wie ich das machen soll.
Ich kenne den Comparator nur als eigenständige Klasse die auf Objekte der anderen Klasse zugreift.
Und dann mit Hilfe von compareTo 2 Objekte vergleicht und dann sortiert. Wie kann ich das hier machen, muss ich die methode bubble angeben ?

Hier mal ein wohl fehlerhafter Anfang von mir:


```
public class ArraySortierer <String> {

public arraySortierer (ArrayList<String> data) {
x = data;
}

public void criteriaSort (int criteria)
if(criteria ==1){
Comparator comp = new Comparator();
comp.compare(a, c);
}else{
Comparator comp1 =  new Comparator();
comp1.compare1(a,c);
}

public class StringComparator implements Comparator <ArraySortierer> {

public int compare (ArraySortierer a , ArraySortierer c) {
x =  a.length().compareTo(c.length());
return x;
}

public int compare1 (ArraySortierer a, ArraySortierer c) {
x = a.bubble().compareTo(c.bubble());
return x;
}
```


----------



## InfectedBytes (5. Nov 2015)

ich fürchte du hast Comparator noch nicht korrekt verstanden.
Ein comparator dient nur dazu zwei items zu vergleichen.
In deinem Fall willst du Strings vergleichen, weswegen dein Comparator von Comparator<String> erben muss.

Und diesem Comparator benutzt du dann in deinem Bubblesort, wenn es darum geht zwei Werte miteinander zu vergleichen


----------



## erdochef (5. Nov 2015)

Muss also nur der Datentyp von ArraySortierer in String geändert werden?

Also ist der Klassenname dann :
public class StringComparator implements Comparator <String> ?

und wie übergebe ich diesen Comparator in meinem Bubblesort?
bzw. wie vergleich er diese dann dort einmal wegen der Länge und einmal alphabetisch? Also ich meine wo genau kann ich das in der Methode bubble angeben?


----------



## erdochef (6. Nov 2015)

Niemand ein Tipp, wie ich beginnen kann?


----------



## erdochef (9. Nov 2015)

So ich hab das jetzt nochmal probiert und denke bin auf dem richtigen Weg.


```
public class BubbleSort {
private String [] data;

public BubbleSort(ArrayList<String> data){
   this.data = new String [data.size()];
   for(int i = 0; i<data.size(); i++){
     this.data[i] = data.get(i);
   }
}

   
   public void bubble(String[] a, Comparator<String> c) {
   for (int i = 0; i< a.length; i++)
    for (int j = 1; j< a.length-i; j++) {
    if (c.compare(a[j-1], a[j]) > 0 )
    swap(a, j-1, j);
   }
   }
   private void swap(String[] a, int pos1, int pos2){
   String hlp = a[pos1];
   a[pos1] = a[pos2];
   a[pos2] = hlp;
   }
    }


public class BubbleCompALP implements Comparator<String> {
public int compare( String b1, String b2){
   if (b1.length()>b2.length()){
     return 1;
   } else if (b1.length()>b2.length()){
     return -1;
     
   }else {
     return 0;
   }
}
}
```
Der Comparator gibt ja nur an nach was sortiert werden soll, hier nach der Länge.

Aber wie kann ich jetzt ein beliebiges Array erstellen und dieses mit der bubble Methode sortieren lassen? Bekommen den Aufruf nicht  hin.

Und wie kann ich alphabetisch sortieren, also wie sieht die Methode dazu aus?


----------



## klauskarambulut (9. Nov 2015)

Soll alphabetisch oder lexikographisch sortiert werden?
Länge kann man auch so überprüfen.

```
public class BubbleCompALP implements Comparator<String>{
  public int compare(String b1, String b2){
   Integer length1 = b1.length();
   Integer length2 = b2.length();
   return length1.compareTo(length2);
  }
}
```


```
public class StringComparatorLexicographisch implements Comparator<String>{
  public int compare(String b1, String b2){
   return b1.compareTo(b2);
  }
}
```

Alphabetisch gibt es zum Beispiel schon String.CASE_INSENSITIVE_ORDER.

Dann brauchst du ja noch die Methode criteriaSort(int criteria)

```
public void criteriaSort(int criteria) {
  switch(criteria) {
    case 1: 
      bubble(data, new BubbleCompALP());
      // JAVA 8-Style
      // bubble(data, Comparator.comparingInt(String::length));
      break;
    case 2:
      bubble(data, String.CASE_INSENSITIVE_ORDER);
      break;
    default: 
      System.out.println("FIG DIG: Nur 1 und 2 erlaubt");
  }
}
```


----------



## erdochef (9. Nov 2015)

klauskarambulut hat gesagt.:


> Soll alphabetisch oder lexikographisch sortiert werden?
> Länge kann man auch so überprüfen.
> 
> ```
> ...



Klasse das hilft mir doch schonmal sehr weiter.
Ja, ich soll alphabetisch sortieren.

Habe jetzt die Klasse so geändert/eingefügt, aber irgendwie kann die die Liste nicht richtig befüllen und sortieren. Komme da nicht drauf, vll ist es auch schon spät ^^


```
public static void main(String[]args){
        ArrayList<String> liste = new ArrayList<String>();
      liste.add("Alf");
      liste.add("Bert");
      liste.add("Manuel");
       liste.
```


----------



## erdochef (11. Nov 2015)

Jmd. eine Idee warum ich nicht einfach die leiste befüllen kann und dann die Methode criteriaSort dazu aufrufen kann? Damit ich dann ein Stringarray nach dem gewünschten Comparator mit der Bubblemethode sortieren kann.


----------

