wie tree besser generieren?

schuetzejanett

Erfahrenes Mitglied
Hallo,

also ich habe eine Tabelle (Arraylist mit Objekten einer klasse), diese möchte ich als Baum gruppieren, also das für jeden verschiedenen Eintrag der ersten Spalte ein Knoten angelegt wird, und dann weiter für jeden verschiedenen der 2. spalte ein Unterknoten unter dem jeweiigen Knoten der ersten spalte

Dafür habe ich mir jetzt eine methode geschrieben.
Diese sortiert als erstes die arraylist nach allen spalten.
Anschließend durchläuft sie die Arraylist und prüft die gleichheit bei zwei aufeinanderfolgenden indizes. sind sie gleich wird die anzahl um eins erhöht und wenn nicht ein Treeitem angelegt. Danach wird so groß wie dieanzahl ist die nächste spalte überprüft und Treeitems angelegt us.w. bis ich eine struktur mit mit 5 ebenen habe.

Das ganze funktioniert auch im großen und ganzen, aber ich habe probleme mit dem letzten eintrag, dieser wird teilweise doppelt angezeigt.
Und außerdem denke ich da mein quelltext irgendwie zu unstrukturiert mit zuvielen variabeln ist.
Deswegen die frage an euch.
Was denkt ihr wenn ihr diesen Quelltext lest. Was sollte ich ändern oder was könnte ich anders schreiben?
Und wie bekomme ich das problem mit der letzten zeile/letztem eintrag in den Griff?

der gibt es eine andere Möglichkeit eine gruppierung der arraylist als baum darszustellen?

Hier der Code
Code:
public Tree tree; 
   public TreeViewer treeViewer; 
   public TreeItem tPaperKind; 
   public ArrayList allePK; 
   public ArrayList alleRest; 
   private TreeItem tJobType; 
   private TreeItem tConPartner; 
   private TreeItem tAttach; 
   private TreeItem tInland; 
    
   class ArraySort implements Comparator<PjOv>{ 
       
      public final static int PAPERKIND    = 0;       
      public final static int JOBTYPE    = 1; 
      public final static int CONTPARTNER = 2;       
      public final static int INLAND       = 3; 
      public final static int ATTACH       = 4; 
    
      public int compare(PjOv pjOv1, PjOv pjOv2) 
         { 
           int result = 0; 
           for (int i = 0; i < 5 && result == 0; i++) 
           { 
              result = doCompare(i, pjOv1, pjOv2); 
           } 
           return  result ; 
         } 
       
      public int doCompare(int sortField,PjOv pjOv1, PjOv pjOv2 ) 
      { 
         int result = 0; 
         switch (sortField) { 
         case PAPERKIND: 
            result = pjOv1.getPaperKind().getName().compareTo(pjOv2.getPaperKind().getName()); 
            break; 
         case JOBTYPE: 
            result = pjOv1.getJobType().getName().compareTo(pjOv2.getJobType().getName()); 
            break; 
         case CONTPARTNER: 
            result = pjOv1.getContractPartner().getName().compareTo(pjOv2.getContractPartner().getName()); 
            break; 
         case INLAND: 
            result = ((Boolean) pjOv1.isInland()).compareTo(((Boolean) pjOv2.isInland()));             
            break; 
         case ATTACH: 
            result = ((Boolean) pjOv1.isInland()).compareTo(((Boolean) pjOv2.isInland())); 
            break; 
         default: 
            break;          
         } 
         return result; 
      }       
   } 
    
    
    
   //generiert aus Arraylist Baum - gruppierungsebenen 
   //als erstes wird ArrayList nach allen Spalten sortiert 
   //werden immer 2 aufeinaderfolgende Papierarten verglichen, sind es die gleichen wird anzP um 1 erhöht 
   //sind sie nicht mehr gleich wird ein Knoten für diese Papierart angelegt und es wird die Jobart verglichen 
   //und zwar sooft wie die papierart gleich wahr 
   //beim testen der tieferliegenden knoten  werden nicht nur die 2 aufeinanderliegender felder verglichen 
   //sondern auch die Spalten die daüberliegen um so auch wirklich die richtige gruppierung zu erhalten 
    
    
   public void generateTree(ArrayList<PjOv> list ) 
   { 
      ArrayList<PjOv> listPjOv = list; 
       
      //Liste  sortieren 
      Collections.sort(listPjOv, new ArraySort()); 
       
      //Baum erstellen 
       
      boolean b1, b2, b3, b4, b5, b6,b7; 
      ArraySort sort = new ArraySort(); 
      // 
      int anzP = 0; 
      int j_ind = 0; 
      int alt_P = 0; 
      for (int i = 1; i<listPjOv.size(); i++ ) 
      { 
          
         try { 
            //Vergleich Papierart 
            if ((sort.doCompare(0, listPjOv.get(i), listPjOv.get(i-1))==0) && (i != (listPjOv.size()-1))) 
            { 
               anzP++; 
            }else 
            {       
               //generiert Knoten für papiersorte 
               generateTreeItem(0, listPjOv.get(i-1).getPaperKind().getPaperDescription()); 
             
               int anzP_akt = anzP; 
               anzP = 0; 
               int anzJ = 0; 
               for (int j=0;j<=anzP_akt;j++) 
               { 
                  j_ind = alt_P+j; 

                  if ((sort.doCompare(1 , listPjOv.get(j_ind), listPjOv.get(j_ind+1))==0) 
                        && (sort.doCompare(0 , listPjOv.get(j_ind), listPjOv.get(j_ind+1))==0) 
                        && (j_ind != (listPjOv.size()-2))) 
                  { 
                     anzJ++; 
                  }else 
                  {                      
                     generateTreeItem(1,  listPjOv.get(j_ind ).getJobType().getDescription()); 
                     int anzJ_akt = anzJ; 
                     anzJ = 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, listPjOv.get(c_ind), listPjOv.get(c_ind+1))==0;                               
                        b3 = sort.doCompare(1, listPjOv.get(c_ind), listPjOv.get(c_ind+1))==0; 
                        b4 =  (c_ind != (listPjOv.size()-2)); 

                        if (b1 && (b2 && b3) && b4) 
                        { 
                           anzC++; 
                        }else 
                        {                            
                           generateTreeItem(2, listPjOv.get(c_ind).getContractPartner().getName()); 
                           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, listPjOv.get(i_ind), listPjOv.get(i_ind+1))==0);                                      
                               b4 = (sort.doCompare(2, listPjOv.get(i_ind), listPjOv.get(i_ind+1))==0); 
                               b5 = (sort.doCompare(1, listPjOv.get(i_ind), listPjOv.get(i_ind+1))==0); 
                               b6 = (sort.doCompare(0, listPjOv.get(i_ind), listPjOv.get(i_ind+1))==0); 
                               b7 =  (i_ind != (listPjOv.size()-2)); 
                            
                              if ((b1 && b2) && (b3 && b4) &&(b5 && b6) && b7) 
                              { 
                                 anzI++; 
                              }else 
                              {                                  
                                 generateTreeItem(3, "" + listPjOv.get(i_ind).isInland());                                     
                                 int anzI_alt = anzI; 
                                 anzI = 0; 
                                 int a_bevor = i_ind -anzI_alt; 
                                 for (int m = 0; m<= anzI_alt; m++) 
                                 { 
                                    int a_ind = a_bevor+m; 
                                    generateTreeItem(4,  ""+listPjOv.get(a_ind).isAttach()); 
                                 } 
                              } 
                           } 
                        } 
                     } 
                  } 
               }                
               alt_P = i; 
               if (i == (listPjOv.size()-1)) 
               {                               
                  generateTreeItem(1,  listPjOv.get(i ).getJobType().getDescription()); 
                  generateTreeItem(2, listPjOv.get(i).getContractPartner().getName()); 
                  generateTreeItem(3, "" + listPjOv.get(i).isInland()); 
                  generateTreeItem(4,  ""+listPjOv.get(i).isAttach()); 
               } 
            } 
          
         } catch (Exception e) {             
            e.printStackTrace(); 
         }       
      }       
   } 
    
   private void generateTreeItem(int kind, String text) 
   { 
       
      switch (kind) { 
      case 0: 
         tPaperKind = new TreeItem(tree, SWT.NONE); 
         tPaperKind.setText(text);       
         break; 
      case 1: 
         tJobType = new TreeItem(tPaperKind, SWT.NONE); 
         tJobType.setText(text); 

         break; 
      case 2: 
         tConPartner = new TreeItem(tJobType, SWT.NONE); 
         tConPartner.setText(text); 
         break; 
      case 3: 
         tInland = new TreeItem(tConPartner, SWT.NONE); 
         text = text.equals("true") ?  "Inland:Ja" : "Inland:Nein"; 
         tInland.setText(text);          
         break; 
      case 4: 
         tAttach = new TreeItem(tInland, SWT.NONE); 
         text = text.equals("true") ?  "Anhang:Ja" : "Anhang:Nein"; 
         tAttach.setText(text);          
         break; 
      default: 
         break; 
      } 
   }

und hier wie das derzeitige ergebnis aussieht

GoAGnM.jpg


Wie müsste ich den content bzw Labelprovieder überschreiben wenn ich das ganze mit nem jface treeviewer machen möchte und geht das in dem falle überhaupt?
 
Zurück