OOP Logikhilfe zum Comparator 2

Basti4231

Bekanntes Mitglied
Hi Leute, ich hatte schonmal ein Thema dazu, aber jetzt ist noch was dazu gekommen.

Ich erklärs nochmal kurz, für diejenigen, die es noch nicht kennen.

Es gibt eine ArrayList mit Programmnamen die ausschließlich mit P oder U anfangen, gefolgt von einer vierstelligen Zahl. Also so z.B. P5003
P5003 ist auch das Hauptprogramm welches als einziges Unterprogramme besitzt, also U5032 z.B.
Jetzt wollte ich so sortieren, dass alle P-Programme und P5003 gefolgt von den Unterprogrammen korrekt nach Größe der Zahl geordnet sind. Das war auch fertig.

Jetzt aber würde ich gerne diesen Comparator erweitern mit einer kleinen Funktion, da falls es nicht klappen sollte, so wie ich mir das gerade vorstelle, viel Arbeit bevorsteht^^

Ich habe da nämlich ein ExcelDokument was ich schreibe, in der 1. Spalte stehen dann die sortierten Programme. Da gibt es aber noch eine 2. und 3. Spalte, zu den jeweiligen Programmen. Da stehen dann Zahlen drin. Bei Spalte 2 kommt es z.B. oft vor, dass 44 drin steht (Hat einen bestimmten Grund, tut aber hier nix zur Sache).

Es muss so sein, dass ich am Schluss in einer ArrayList erst die Programmnamen und dann die beiden Spalten mit den ZahlenWerten drin habe. Die kann ich dann zum schreiben für das neue Excel-Dokument benutzen.

Ich weiß leider gerade nicht wie ich das genau machen soll. Hat jemand eine Idee , oder auch eine Idee wie ich es anders machen könnte ? :)


Hier ist mal der Code vom Comparator
Java:
import java.util.Comparator;

public class ProgramNameComparator implements Comparator<String> {

    public int compare(String s1, String s2) {

        if (s1.equals(s2)) {
            return 0;
        }
        if (s1.charAt(0) == 'U') {
            if (s2.charAt(0) == 'U') {
                return (s1.substring(1).compareTo(s2.substring(1)));
            } else {
                int number = Integer.valueOf(s2.substring(1));
                if (number <= 5003) {
                    return 1;
                } else {
                    return -1;
                }
            }
        } else {
            if (s2.charAt(0) == 'U') {
                int number = Integer.valueOf(s1.substring(1));
                if (number <= 5003) {
                    return -1;
                } else {
                    return 1;
                }
            } else {
                return (s1.compareTo(s2));
            }
        }
    }
}

Vielen lieben Dank, denn ich weiß auf euch ist Verlass!!!

lg Basti
 
Z

Zacherl

Gast
Ich nehme an, du hast am Anfang die Zuordnung der Werte in den beiden Spalten zum Programmnamen, allerdings weißt du nicht, wie du die Spalten sortieren sollst, wenn du den Programmnamen sortiert hast.

Kannst du nicht einfach ein Objekt für jedes Programm erstellen mit Namen/Spalten als Attributen?

Java:
public class Programm {

   private String name;
   private int spalte1;
   private int spalte2;
   
   ...

Und anschließend schreibst du den Comparator für dieses Objekt, benutzt aber denselben String-Vergleich (indem du eben auf den Namen vom Programm zugreifst). Wenn du nun eine ArrayList, das mit den Programmobjekten gefüllt ist (ArrayList<Programm>), sortierst, dann solltest du auch die Spalten in der richtigen Reihenfolge haben.
 

Basti4231

Bekanntes Mitglied
Also das mit den Objekten finde ich eine gute Idee! Sollte ja auch eigentlich OOP sein^^
Ich gerate da öfter auf schiefe Bahnen zwecks Flexibilität und OOP. Aber man lernt dazu :)

Wo ich noch nicht ganz dabei bin ist der Punkt mit der ArrayList und den Spalten. Ich kanns mir nich so vorstellen wie du es schreibst, für mich ist in meiner Vorstellung immer noch die ArrayList wo nur Programmnamen drin sind und ich kann die Verbindung im Moment nicht herstellen zwischen der List und den Spalten?

Kannst du mir ein wenig auf die Sprünge helfen bitte?

Danke :)
 

ARadauer

Top Contributor
wobei man natürlich darüber streiten kann, ob das sinn macht...

Java:
import java.util.ArrayList;
import java.util.Collections;


public class Programname implements Comparable<Programname> {
   private String name;     
   private String mysterySpalte;   
  
   
   public Programname(String name){
      setName(name);
   }
   
   public Programname(String name, String mysterySpalte){
      this(name);
      this.mysterySpalte = mysterySpalte;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getMysterySpalte() {
      return mysterySpalte;
   }

   public void setMysterySpalte(String mysterySpalte) {
      this.mysterySpalte = mysterySpalte;
   }
   
   public int getNumber() {
      return Integer.parseInt(name.substring(1, name.length())); 
     }

   public boolean isUnterprogramm() {
      return name.charAt(0) == 'U';      
   }
   public boolean is44Spalte(){
      return "44".equals(mysterySpalte);
   }
   
   public String toString(){
      StringBuffer buf = new StringBuffer();
      
      if(isUnterprogramm())
         buf.append(" ");
      
      buf.append(name);
      
      if(is44Spalte())
         buf.append(" 44");
      
      return buf.toString();
   }   
  

   @Override
   public int compareTo(Programname o) {  
      
    //nur eine der beiden 44.. lässt sich wahrscheinlich noch vereinfachen
      if((is44Spalte() && !o.is44Spalte()) || (!is44Spalte() && o.is44Spalte())){ 
         if(is44Spalte())
            return 1;
         return -1;
      }
         
      if(getNumber() == o.getNumber()){
         if(isUnterprogramm())
            return 1;
         return -1;
      }
      if(getNumber()< o.getNumber())
         return -1;
      return 1;
   }
   
   public static void main(String[] args) {
      ArrayList<Programname> names = new ArrayList<Programname>();
      names.add(new Programname("P1234"));
      names.add(new Programname("P1237"));
      names.add(new Programname("P1236"));
      names.add(new Programname("U1236"));
      names.add(new Programname("P1112", "44"));
      names.add(new Programname("P1111", "44"));
      names.add(new Programname("U1234"));
      
      
      Collections.sort(names);
      
      for(Programname name : names)
         System.out.println(name);
   }
}
 

ymene

Bekanntes Mitglied
Ich würds genauso machen, wie ich dir bereits in deinem ersten Thread geantwortet habe, nur mit der Erweiterung, dass du in die Oberklasse auch die beiden Spaltenvalues mit einfügst ;)

Genau für solche Fälle merkt man auch erst, warum Objekte auch sinnvoll sind. Du kannst sie einfach leicht anpassen! Irgendwann taucht noch nen zweites U auf oder nen weiterer Buchstabe und dann haste wieder den Salat ;) Schreib dir ne allgemein gültige Form der Sortierung, dann kann so schnell auch nix schief gehen.
 

Basti4231

Bekanntes Mitglied
ähm^^
Also ich hab jetz deinen Code mal getestet und auch versucht des zu verstehen. Aber ich weiß jetz nich so recht, ob das weiterhilft.
Und wegen den 44, das is ja nicht immer so, also kann man damit nicht fest arbeiten, denke ich. Spalte 2 und 3 sind es, die ich brauche (Beide haben nur Zahlen drin).

Ich habe vorher so ein Excel-Dokument, das ich lese (1. Spalte: Programmnamen; 2. Spalte: Zahlen;
3. Spalte: Zahlen) Das ist die sogenannte Standardfehlerliste. Aus dieser werden dann die Werte geholt, also Programmname und die Werte der 2. und 3. Spalte. Verwendungszweck für diese ist um mit bestimmten .txt-Dateien zu vergleichen ob diese Werte vom .txt-Dokument passen. Bei bestimmten Fällen sind auch in der Standardfehlerliste Änderungen vorzunehmen. Daher muss ich dann auch die neue Standardfehlerliste mit den veränderten Werten schreiben, alles was nicht verändert wurde muss übernommen werden. Und neue Programme, die vielleicht hinzugekommen sind, müssen an der richtigen Stelle stehen. Das hat der bisherige Comparator ja erledigt. Ich hab bis dato die neue Standardfehlerliste geschrieben, aber nur mit der 1. Spalte. Wie ich die 2. und die 3. nach dem sortieren noch dazukriege an die richtige Stelle sind wir ja jetzt am lösen. Wollte nur ein bissl mehr bescheid geben...

lg :)
 
Z

Zacherl

Gast
Versuch das mal:


Java:
public class Programm {
   
   private String name;     
   private String spalte1;   
   private String spalte2; 
  
   
   public Programm(String name, int spalte1, int spalte2){
      setName(name);
      setSpalte1(spalte1);
      setSpalte2(spalte2);
   }

 
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public String getSpalte1() {
      return spalte1;
   }
 
   public void setSpalte1(String spalte1) {
      this.spalte1 = spalte1;
   }

   public String getSpalte2() {
      return spalte2;
   }
 
   public void setSpalte2(String spalte2) {
      this.spalte2 = spalte2;
   }

}

Java:
public class ProgramNameComparator implements Comparator<Programm> {
 
    public int compare(Programm p1, Programm p2) {
 
        if (p1.getName().equals(p2.getName())) {
            return 0;
        }
        if (p1.getName().charAt(0) == 'U') {
            if (p2.getName().charAt(0) == 'U') {
                return (p1.getName().substring(1).compareTo(p2.getName().substring(1)));
            } else {
                int number = Integer.valueOf(p2.getName().substring(1));
                if (number <= 5003) {
                    return 1;
                } else {
                    return -1;
                }
            }
        } else {
            if (p2.getName().charAt(0) == 'U') {
                int number = Integer.valueOf(p1.getName().substring(1));
                if (number <= 5003) {
                    return -1;
                } else {
                    return 1;
                }
            } else {
                return (p1.getName().compareTo(p2.getName()));
            }
        }
    }
}

Wie du deine Liste in das Objekt überträgst, weißt du, oder? Ansonsten benutzt du später statt ner ArrayList<String> eine ArrayList<Programm>.

//Edit: Comparator korrigiert, hab was falsch abgeschrieben.
 
Zuletzt bearbeitet von einem Moderator:
Z

Zacherl

Gast
Du kannst da natürlich auch einen String nehmen, ich dachte du speicherst Zahlen? Klar musst du wenn du die Zahlen als Integer oder Float oder so speicherst, vorher ein Integer.parseInt(...) oder so machen, falls deine Zahlen als String kommen.
 

Basti4231

Bekanntes Mitglied
Ja, ich denke ich mach lieber ein int, da sind nur Zahlen drin.

Ich bin grad dabei!!
Ich denk auch ich krieg das hin, dank eurer Hilfe und jetz hab ich auch verstanden wie das genau mit den Objekten läuft, da das Programm ja als ganzes in der ArrayList gesehen wird und nicht die einzelnen Attribute davon. Das is echt genial so :D

Es wird ganz sicher funktionieren, ich muss grad nur eine Sache lösen. Aber ich geb dann wieder Bescheid wenn sich was tut :)

Vielen Dank:)
 

Basti4231

Bekanntes Mitglied
So jetzt sind alle ProgrammObjekte in der ArrayList drin. Ich hatte nur ein paar Probleme, da manche Zellen null waren, aber habe das jetz geschafft.

Jetz muss ich nur noch den Comparator anwenden und dann euch das Ergebnis mitteilen^^

lg :)
 

Basti4231

Bekanntes Mitglied
GESCHAFFT.
Neues Excel-Dokument ist sehr sauber geordnet und mit neuen Werten. Ach wie herrlich :toll:

Man ihr seid echt die besten!!!
VIELEN VIELEN DANK :D:D:D

gruß basti
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B OOP Logikhilfe zum Comparator Java Basics - Anfänger-Themen 11
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
M Comparator Java Basics - Anfänger-Themen 25
M Comparator Java Basics - Anfänger-Themen 4
berserkerdq2 Wie lege ich ein Attribut comparator an? Java Basics - Anfänger-Themen 13
W Personen sortieren mit Comparator Java Basics - Anfänger-Themen 9
H Comparator Fehlermeldung Java Basics - Anfänger-Themen 5
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
O Lambda Ausdrücke in einem Comparator Java Basics - Anfänger-Themen 4
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
J Comparator Java Basics - Anfänger-Themen 21
A Comparator Java Basics - Anfänger-Themen 4
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
V Comparator Java Basics - Anfänger-Themen 16
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparator und private Variablen Java Basics - Anfänger-Themen 7
S Comparator für Generiks Java Basics - Anfänger-Themen 6
Helgon Interface Comparator wird nicht instanziert Java Basics - Anfänger-Themen 3
C Comparator mit Double Werten? Java Basics - Anfänger-Themen 12
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
E Comparator sortiert falsch... Java Basics - Anfänger-Themen 2
M Comparator Java Basics - Anfänger-Themen 7
G Comparator Problem Java Basics - Anfänger-Themen 5
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
H Comparable und Comparator Java Basics - Anfänger-Themen 22
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
B OOP Comparator - Sortierung "optisch" Darstellen Java Basics - Anfänger-Themen 17
A JTable sortieren mit einem Comparator Java Basics - Anfänger-Themen 2
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
G Objekte mit dem Attribut title mit Comparator sortieren Java Basics - Anfänger-Themen 5
P unchecked conversion to conform to Comparator Java Basics - Anfänger-Themen 3
G Comparator- methode compare exception werfen Java Basics - Anfänger-Themen 4
B interface Comparator Java Basics - Anfänger-Themen 4
M Hilfe bei der Erstellung der Comparator Klasse Java Basics - Anfänger-Themen 10
M ArrayList sortieren mittels Comparator Java Basics - Anfänger-Themen 10
G Sortieren ohne Comparator? Java Basics - Anfänger-Themen 4
G Comparator Java Basics - Anfänger-Themen 10
S Frage zu Comparator Java Basics - Anfänger-Themen 3
G ArrayList und Comparator Java Basics - Anfänger-Themen 6
M Comparator - Sortierkriterium Java Basics - Anfänger-Themen 11
L Comparator Java Basics - Anfänger-Themen 5
T Problem mit Comparator! Java Basics - Anfänger-Themen 7
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
B Liste sortieren mit Comparator Java Basics - Anfänger-Themen 2
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
S JTable mit Comparator sortieren, die Frage ist wo? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
W Comparator Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben