Sortieren aber anders

Guten Tag


mir liegen 2 Wörter vor, die aus den Sequenzen Rot", "Blau", "Grün", "Weiss", "Gelb", "Schwarz", "Violet" bestehen und können beliebig lang sein. z.b.



w1=GrünGrünRotWeissVioletSchwarz
w2=GrünWeissWeissVioletBlauGelbWeissRotGrün


nun will ich die Wörter soetieren und zwar nach dem Prinzip


Rot<Blau<Grün<Weiss<Gelb<Schwarz<Violet


hat jemand eine Idee?


gruss
 
Hi,

in deinem Beispiel müsste also w2 vor w1 kommen, da Weiss eine höhere Gewichtung hat?

Ich würde ein Enum "Farbe" mit für alle Farben anlegen und das Comparable Interface implementieren. Vom Ablauf her würde ich jeden String in eine Liste aus den Enums umwandeln und anschliessen per Compare vergleichen lassen. Die Liste würde ich ein ein eigenes Object kapseln und in dieser wieder die Comparable implementieren, diesmal halt auf Listen-Ebene.

Grüsse,
BK
 
Moin,

na, wie erledigen hier nicht Deine Hausaufgaben !!

Poste doch mal Deinen Ansatz und stell dann konkrete Fragen dazu ... dan wird Dir sicher gerne geholfen !
Nur so lernst Du auch was ... ;)

Gruß Klaus
 
ich habe folgende Ansatz aber ich weiss nicht wie soll ich auf die Wörter anwenden



Code:
import java.io.*;


enum Farbe implements Comparable <Farbe >{


ROT ("Rot"),

BLAU ("Blau"),

GRUEN ("Grün"),

WEISS ("Weiss"),

GELB ("Gelb"),

SCHWARZ ("Schwarz"),

VIOLET ("Violet");


private String beschreibung;


Farbe(String beschreibung) {

this.beschreibung = beschreibung;

}





}
 
Hmm ich würde es ungefähr so machen:

Ein Objekt in welchem den String Wert ein Integer Wert zugewiesen wird nach dem sortiert werden kann:

StrValue.java
Java:
package tut;

public class StrValue implements Comparable<StrValue> {
   private Integer value;
   private String name;

   public StrValue() {

   }

   public StrValue(String name, int value) {
     this.value = value;
     this.name = name;
   }

   public Integer getValue() {
     return value;
   }

   public void setValue(Integer value) {
     this.value = value;
   }

   public String getName() {
     return name;
   }

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

   @Override
   public int compareTo(StrValue strValue) {
     if (strValue == null) {
       return -1;
     }
     return this.getValue().compareTo(strValue.getValue());
   }
   @Override
   public String toString(){
     return this.getName()  + ":\t" + this.getValue();
   }

}

Dann einen "Sorter"

StrValueSorter.java
Java:
package tut;

import java.util.Arrays;

public class StrValueSorter {
   
   public StrValueSorter(String[] values, StrValue[] FindValues ){

     StrValue[] valuesToSearch = new StrValue[3];
     for (int i = 0; i < values.length; i++) {
       valuesToSearch[i] = new StrValue();
       valuesToSearch[i].setName(values[i]);
       valuesToSearch[i].setValue(0);
     }
     for (int i = 0; i < FindValues.length; i++) {
       for (int j = 0; j < valuesToSearch.length; j++) {
         valuesToSearch[j].setValue(valuesToSearch[j].getValue()+getSortValue(valuesToSearch[j].getName(),FindValues[i]));
       }
     }
   
     System.out.println("Unsotiert");
     for (int i = 0; i < valuesToSearch.length; i++) {
       System.out.println(valuesToSearch[i]);
     }
     Arrays.sort(valuesToSearch);
     System.out.println("Sotiert");
     for (int i = 0; i < valuesToSearch.length; i++) {
       System.out.println(valuesToSearch[i]);
     }
   }

   public static int getSortValue(String input, StrValue toFind){
     int lastIndex = 0;
     int count = 0;
     while(lastIndex != -1){

      lastIndex = input.indexOf(toFind.getName(),lastIndex);

      if(lastIndex != -1){
      count += toFind.getValue();
      lastIndex += toFind.getName().length();
      }
     }
     return count;
   }
}

Und zum Ausführen die Main
Java:
package tut;

public class Main {
   public static void main(String []args){
     
     StrValue[] sortValues = new StrValue[7];
     sortValues[0] = new StrValue("Rot",1);
     sortValues[1] = new StrValue("Blau",2);
     sortValues[2] = new StrValue("Grün",3);
     sortValues[3] = new StrValue("Weiss",4);
     sortValues[4] = new StrValue("Violet",5);
     sortValues[5] = new StrValue("Blau",6);
     sortValues[6] = new StrValue("Gelb",7);
     
     String[] values = new String[3];
     values[0] = "GrünGrünRotWeissVioletSchwarz";
     values[1] = "GrünWeissWeissVioletBlauGelbWeissRotGrün";
     values[2] = "GrünWeissVioletBlauGelbWeissRotGrün";
   
     new StrValueSorter(values, sortValues);
   
   }
   

}

Aber nur ungefähr ;D
Ich kann dir nicht sagen ob es 100% best practice ist.

Viele Grüße
Youza

Ps.: Ist als Eclipse Projekt angehängt
 

Anhänge

  • strValue.zip
    8,8 KB · Aufrufe: 15
[...]
Ein Objekt in welchem den String Wert ein Integer Wert zugewiesen wird nach dem sortiert werden kann:
StrValue.java
Das ist quasi ein Enum ;) Ein enum hat ein ord() (int) welches quasi den Index im enum angibt.

Weiss ned ob das so funktioniert, ich gehe hier nur auf ein paar Sachen ein die mir beim kurz drüberfliegen aufgefallen sind:
- Im StrValueSorter:10 erstellst du zum Beispiel einfach ein Array mit 3 Elementen egal wie viele "values" da rein kommen => ArrayIndexOutOfBounds
- Erstellst du deinen "new StrValue()", dann sind keine der Felder initialisiert. compare() => NullPointerException
- Du machst im StrSorter die komplette Logik / Ausgaben innerhalb des Konstruktors

Grüsse,
BK
 
Jo schon aber sollte locker ausreichen damit man versteh wie man es machen kann zum Nullpointer kann man ja die Initialisierung auf den Constructor mit den Werten beschränken. Die anzahl der values sollte ja davor bekannt sein kann das ganze auch dynamischer machen ist mir klar ;)

UND ja es funktioniert so ;D

Die Ausgaben im Constructor ja nicht unbedingt ideal aber als ansatz reicht es alle mal ;)

EDIT:
Ach lol jetzt hab ich erst gesehen was du mit dem Stack Over Flow meinst des war nur noch alter Code der darin rumgegammelt muss natürlich values.length sein statt 3 :D

Hier nochmal überarbeitet:

Main.java
Java:
public class Main {
   public static void main(String []args){
     
     StrValue[] sortValues = new StrValue[7];
     sortValues[0] = new StrValue("Rot",1);
     sortValues[1] = new StrValue("Blau",2);
     sortValues[2] = new StrValue("Grün",3);
     sortValues[3] = new StrValue("Weiss",4);
     sortValues[4] = new StrValue("Violet",5);
     sortValues[5] = new StrValue("Blau",6);
     sortValues[6] = new StrValue("Gelb",7);
     
     String[] values = new String[6];
     values[0] = "GrünGrünRotWeissVioletSchwarz";
     values[1] = "GrünWeissWeissVioletBlauGelbWeissRotGrün";
     values[2] = "GrünGrünRotWeiss";
     values[3] = "GrünWeissVioletBlauGelbWeissRotGrün";
     values[4] = "GrünWeissVioletBlauGelbWeissRotGrünVioletBlauGelbWeissRotGrün";
     values[5] = "GelbGelb";
   
     StrValueSorter sorter = new StrValueSorter(values, sortValues);
     
     System.out.println("Unsortiert:");
     sorter.printValuesToSearch();
     
     
     sorter.sortValuesToSearch();
     
     System.out.println("\nSortiert:");
     sorter.printValuesToSearch();
   
   }
   

}

StrValue.java
Java:
public class StrValue implements Comparable<StrValue> {
   private Integer value;
   private String name;

   public StrValue(String name, int value) {
     this.value = value;
     this.name = name;
   }

   public Integer getValue() {
     return value;
   }

   public void setValue(Integer value) {
     this.value = value;
   }

   public String getName() {
     return name;
   }

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

   @Override
   public int compareTo(StrValue strValue) {
     if (strValue == null) {
       return -1;
     }
     return this.getValue().compareTo(strValue.getValue());
   }
   @Override
   public String toString(){
     return this.getValue()  + "\t(" + this.getName() + ")";
   }

}

StrValueSorter.java
Java:
import java.util.Arrays;

public class StrValueSorter {
   private StrValue[] valuesToSearch;

   public StrValue[] getValuesToSearch() {
     return valuesToSearch;
   }

   public StrValueSorter(String[] values, StrValue[] FindValues) {

     valuesToSearch = new StrValue[values.length];
     for (int i = 0; i < values.length; i++) {
       valuesToSearch[i] = new StrValue(values[i],0);
     }
     for (int i = 0; i < FindValues.length; i++) {
       for (int j = 0; j < valuesToSearch.length; j++) {
         valuesToSearch[j].setValue(
             valuesToSearch[j].getValue() + getSortValue(valuesToSearch[j].getName(), FindValues[i]));
       }
     }
   }

   public void sortValuesToSearch() {
     if (valuesToSearch != null)
       Arrays.sort(valuesToSearch);
   }

   public void printValuesToSearch() {
     if (valuesToSearch != null) {
       for (int i = 0; i < valuesToSearch.length; i++) {
         System.out.println(valuesToSearch[i]);
       }
     }
   }

   public static int getSortValue(String input, StrValue toFind) {
     int lastIndex = 0;
     int count = 0;
     while (lastIndex != -1) {

       lastIndex = input.indexOf(toFind.getName(), lastIndex);

       if (lastIndex != -1) {
         count += toFind.getValue();
         lastIndex += toFind.getName().length();
       }
     }
     return count;
   }
}


Viele Grüße
Youza
 

Anhänge

  • strValue.zip
    3 KB · Aufrufe: 15
Zuletzt bearbeitet:

Neue Beiträge

Zurück