Hallo
habe die Aufgabe das Angebot einer Apotheke zu Modellieren. Zu jedem Medikament ist die Firma(z.b. Aurum), Zweck(z.b Kopfschmerzen) ,Art(z.b Tropfen) dann Name( z.b. Wunderwerk) und dann Inhalt(z.B. 10) Die ersten 4 werte werden als String und der letzte als Zahl gespeichert. Ich bekomme jetzt eine Arraylist gegeben ,welche eine beliebig große Menge an Medikamanten enthält und soll diese guppieren( Als Baum ausgeben) Zum testen haben wir eine Liste bekommen, aber die Abnahme erfolgt mit einer anderen. Es soll also am Ende so aussehen
-Aurum
-Kopfschmerzen
-Tabletten
- Kopfweh Weg
-10
-20
- Neuromehr
-10
-20
+Tropfen
-Zahnschmerzen
+Spray
+Tabletten
+Tropfen
ein Eintrag der Arraylist sieht so aus: Aurum Kopfschmerzen Tabletten Neuromehr 10
jetzt habe ich mir überlegt die Arraylist als erstes nach allen Spalten zu sortieren, das funzt auch fehlerfrei.
Doch bei der Erstellung des Baumes hänge ich. den Baum erstellen kann ich zwar (also das anlegen der tree Elemente (in SWT) aber ich habe Probleme wenn sich am ende der liste. Sind dort 2 Elemente fast gleich wird fü as letzte element noch ein extra pfad angelegt (siehe Bild)
Habe das Problem bis jetzt so gelöst aber es sind halt noch bugs enthalten, hoffe mir kann jemand sagen wie ich diese behebe
also als erstes sortiere ich die liste
dann vergleiche ich das n.te element des zwecks mit dem n+1 ten element des zwecks und zähle wie oft das gleich ist, diese zahl merke ich mir dann erstelle ich ein Baumelement mit diesem Zweck, jetzt zähle ich in einer inneren schleife wieder die gleichen Elemente usw.
Hier ist mein Quellcode für das Sortieren
und jetzt das fürs baum erstellen, die Methode generateTree wird von der shell beim erstellen aufgerufen
Wie gesagt ich bin mit dem code selber nicht zufrieden, hatte aber leider keine andere Idee wie ich das Problem lösen kann, bin aber für jegliche Ideen offen.
Nur war Vorgabe an der Struktur nix zu ändern also der für Medikament.
habe die Aufgabe das Angebot einer Apotheke zu Modellieren. Zu jedem Medikament ist die Firma(z.b. Aurum), Zweck(z.b Kopfschmerzen) ,Art(z.b Tropfen) dann Name( z.b. Wunderwerk) und dann Inhalt(z.B. 10) Die ersten 4 werte werden als String und der letzte als Zahl gespeichert. Ich bekomme jetzt eine Arraylist gegeben ,welche eine beliebig große Menge an Medikamanten enthält und soll diese guppieren( Als Baum ausgeben) Zum testen haben wir eine Liste bekommen, aber die Abnahme erfolgt mit einer anderen. Es soll also am Ende so aussehen
-Aurum
-Kopfschmerzen
-Tabletten
- Kopfweh Weg
-10
-20
- Neuromehr
-10
-20
+Tropfen
-Zahnschmerzen
+Spray
+Tabletten
+Tropfen
ein Eintrag der Arraylist sieht so aus: Aurum Kopfschmerzen Tabletten Neuromehr 10
jetzt habe ich mir überlegt die Arraylist als erstes nach allen Spalten zu sortieren, das funzt auch fehlerfrei.
Doch bei der Erstellung des Baumes hänge ich. den Baum erstellen kann ich zwar (also das anlegen der tree Elemente (in SWT) aber ich habe Probleme wenn sich am ende der liste. Sind dort 2 Elemente fast gleich wird fü as letzte element noch ein extra pfad angelegt (siehe Bild)
Habe das Problem bis jetzt so gelöst aber es sind halt noch bugs enthalten, hoffe mir kann jemand sagen wie ich diese behebe
also als erstes sortiere ich die liste
dann vergleiche ich das n.te element des zwecks mit dem n+1 ten element des zwecks und zähle wie oft das gleich ist, diese zahl merke ich mir dann erstelle ich ein Baumelement mit diesem Zweck, jetzt zähle ich in einer inneren schleife wieder die gleichen Elemente usw.
Hier ist mein Quellcode für das Sortieren
Code:
public class ArraySort implements Comparator<Medikament>
{
public final static int FIRMA = 0;
public final static int ZWECK = 1;
public final static int ART = 2;
public final static int NAME = 3;
public final static int INHALT = 4;
public int compare(Medikament med1, Medikament med2)
{
int result = 0;
for (int i = 0; i < 5 && result == 0; i++)
{
result = doCompare(i, med1, med2);
}
return result;
}
public ArraySort()
{
super();
}
public int doCompare(int sortField, Medikament med1, Medikament med2)
{
int result = 0;
switch (sortField)
{
case FIRMA:
result = med1.firma.compareTo(
med2.firma);
break;
case ZWECK:
result = med1.zweck.compareTo(
med2.zweck);
break;
case ART:
result = med1.art.compareTo(
med2.art);
break;
case NAME:
result = med1.name.compareTo(med2.name);
break;
case INHALT:
result = ((Integer)med1.inhalt).compareTo((Integer)med2.inhalt);
break;
default:
break;
}
return result;
}
}
und jetzt das fürs baum erstellen, die Methode generateTree wird von der shell beim erstellen aufgerufen
Code:
public void generateTree(ArrayList<Medikament> liste)
{
try
{
ArrayList<Medikament> list = liste;
Collections.sort(list, new ArraySort());
for (Medikament med : list)
{
System.out.println(med.firma + " "
+ med.zweck + " "
+ med.art + " "
+ med.name + " " + med.inhalt);
}
boolean b1, b2, b3, b4, b5, b6, b7;
ArraySort sort = new ArraySort();
//
int anzF = 0;
int j_ind = 0;
int alt_F = 0;
for (int i = 1; i < list.size(); i++)
{
// Vergleich Firma
if ((sort.doCompare(0, list.get(i), list.get(i - 1)) == 0)
&& (i != (list.size() - 1)))
{
anzF++;
} else
{
// generiert Knoten für Firma
generateTreeItem(0, list.get(i - 1).firma);
int anzF_akt = anzF;
anzF = 0;
int anzZ = 0;
for (int j = 0; j <= anzF_akt; j++)
{
j_ind = alt_F + j;
if ((sort.doCompare(1, list.get(j_ind), list
.get(j_ind + 1)) == 0)
&& (sort.doCompare(0, list.get(j_ind),
list.get(j_ind + 1)) == 0)
&& (j_ind != (list.size() - 2)))
{
anzZ++;
} else
{
generateTreeItem(1, list.get(j_ind).zweck);
int anzJ_akt = anzZ;
anzZ = 0;
int anzC = 0;
int k_bevor = j_ind - anzJ_akt;
for (int k = 0; k <= anzJ_akt; k++)
{
int c_ind = k_bevor + k;
b1 = (anzJ_akt != 0);
b2 = sort.doCompare(2, list.get(c_ind),
list.get(c_ind + 1)) == 0;
b3 = sort.doCompare(1, list.get(c_ind),
list.get(c_ind + 1)) == 0;
b4 = (c_ind != (list.size() - 2));
if (b1 && (b2 && b3) && b4)
{
anzC++;
} else
{
generateTreeItem(2, list.get(c_ind) .art);
int anzC_akt = anzC;
anzC = 0;
int anzI = 0;
int i_bevor = c_ind - anzC_akt;
for (int l = 0; l <= anzC_akt; l++)
{
int i_ind = i_bevor + l;
b1 = (anzC_akt != 0);
b2 = (l != anzC_akt);
b3 = (sort.doCompare(3, list
.get(i_ind), list
.get(i_ind + 1)) == 0);
b4 = (sort.doCompare(2, list
.get(i_ind), list
.get(i_ind + 1)) == 0);
b5 = (sort.doCompare(1, list
.get(i_ind), list
.get(i_ind + 1)) == 0);
b6 = (sort.doCompare(0, list
.get(i_ind), list
.get(i_ind + 1)) == 0);
b7 = (i_ind != (list.size() - 2));
if ((b1 && b2) && (b3 && b4)
&& (b5 && b6) && b7)
{
anzI++;
} else
{
generateTreeItem(3, ""
+ list.get(i_ind)
.name);
int anzI_alt = anzI;
anzI = 0;
int a_bevor = i_ind - anzI_alt;
// if (i_ind == (listPjOv.size()-2))
// {
// anzI_alt++;
// }
for (int m = 0; m <= anzI_alt; m++)
{
int a_ind = a_bevor + m;
generateTreeItem(4, ""
+ list.get(a_ind)
.inhalt);
}
}
}
}
}
}
}
alt_F = i;
if (i == (list.size() - 1))
{
generateTreeItem(1, list.get(i).zweck
);
generateTreeItem(2, list.get(i).
art);
generateTreeItem(3, list.get(i).name);
generateTreeItem(4, "" + list.get(i).inhalt);
}
}
}
} catch (Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
}
private void generateTreeItem(int kind, String text)
{
switch (kind)
{
case 0:
tZweck = new TreeItem(treeSortiment, SWT.NONE);
tZweck.setText(text);
tZweck.setData(text);
break;
case 1:
tFirma = new TreeItem(tZweck, SWT.NONE);
tFirma.setText(text);
tFirma.setData(text);
break;
case 2:
tArt = new TreeItem(tFirma, SWT.NONE);
tArt.setText(text);
tArt.setData(text);
break;
case 3:
tName = new TreeItem(tArt, SWT.NONE);
tName.setData(text);
tName.setText(text);
break;
case 4:
tInhalt = new TreeItem(tName, SWT.NONE);
tInhalt.setData(text);
tInhalt.setText(text);
break;
default:
break;
}
}
Wie gesagt ich bin mit dem code selber nicht zufrieden, hatte aber leider keine andere Idee wie ich das Problem lösen kann, bin aber für jegliche Ideen offen.
Nur war Vorgabe an der Struktur nix zu ändern also der für Medikament.