tutorials.de Buch-Aktion 02/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
2025
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    smartin123 smartin123 ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    65
    Hallo,

    ich bin auf der Suche, nach einem Algorithmus, der mir die Kombinationen von n-verschieden Arrays und n-verschiedenen Items berechnet.
    Mein Tool läuft sonst grafisch basiert, ich habe hier zu Testzwecken ein konsolenbasiertes Tool geschrieben. Bei dem GUI-Tool stehen dem User verschiedenste Comboboxen, mit Möglichkeit der Mehrfachselektion, zur Verfügung.

    Class Main:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    package rekursion;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class TestMain {
        
        /**
         * Test-Main
         * @param args
         */
        public static void main(String[] args) {
            
            //object instancing
            TestMain testMain = new TestMain();
            
            //*******************************************************************
            //First parameter
            String [] selection1 = new String[3];
            selection1[0] = ("A1");
            selection1[1] = ("A2");
            selection1[2] = ("A3");
            
            testMain.setRpCollection(selection1);
            
    //      //Second parameter
            String [] selection2 = new String[2];
            selection2[0] = ("B1");
            selection2[1] = ("B2");
            
            testMain.setRpCollection(selection2);
            
            //Third parameter
            String [] selection3 = new String[2];
            selection3[0] = ("C1");
     
            testMain.setRpCollection(selection3);
            
            //*******************************************************************
            
            Combinations.buildCombinations(0);
            
        }
        
        public void setRpCollection(String[] strArray) {
            
            List<String> arrayList = new ArrayList<String>();
            
            for (int i = 0; i < strArray.length; i++) {
                if (strArray[i] != null)
                {
                arrayList.add(strArray[i]);
                }
            }
            
            Combinations.setCombinations( arrayList);
     
        }
     
     
    }

    Class Combinations:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    package rekursion;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
     
    public class Combinations {
     
        private static List<List<String>> allSelections;
     
        public static String buildCombinations( int ndx )
        {
            
            if( ndx >= allSelections.size() ){
                return "\n";
            }
            
            Iterator<String> iterator = allSelections.get(ndx).iterator();
            String result = "";
            while( iterator.hasNext() ){
                String part = (String) iterator.next();
                result = part + " " + buildCombinations( ndx + 1);
            System.out.println(result);
            }
            return result;
        }
        
        public static void setCombinations(List<String> arrayList) {
            
            // allSelections doesn´t exist and is empty
            if (allSelections == null) {
                allSelections = new ArrayList<List<String>>();
            }
            
            List<String> cacheList = new ArrayList<String>();
            
            for (String selectionItem : arrayList) {
                
                cacheList.add("Part_" + selectionItem);
                
            }
            allSelections.add(cacheList);
            
        }
     
     
    }

    Leider läuft es noch nicht so wie es soll.

    Die Ergebnisliste sollte das lieferen:
    Code :
    1
    2
    3
    4
    5
    6
    
    Part_A1 Part_B1 Part_C1
    Part_A1 Part_B2 Part_C1
    Part_A2 Part_B1 Part_C1
    Part_A2 Part_B2 Part_C1
    Part_A3 Part_B1 Part_C1
    Part_A3 Part_B2 Part_C1

    Geht das überhaupt?

    In meinem GUI-Tool befinden sich verschiedene Comboboxen mit verschiedenen Selections.
    In diesem Test-tool sollen die selections (arrays) die Comboboxen repräsentieren.


    Die Komplexität besteht darain, dass die Parameter und deren Selections n-verschieden sein können.

    Vielleicht ist dies auch ganz einfach zu lösen, leider hab ich darin noch keine Idee,

    Kann man mir bitte jemand helfen?

    Vielen Dank

    MfG
    smartin123
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo,

    hier mal eine einfache iterative Variante:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    package de.tutorials;
     
    public class Combinations {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            Object[][] items = {
                    {
                        "A1","A2","A3"
                    },
                    
                    {
                        "B1", "B2"
                    },
                    
                    {
                        "C1"
                    }
            };
            
            int loops = 1;
            
            for(int i = 0; i < items.length;i++){
                loops *= items[i].length;
            }
            
            int[] indices = new int[items.length];
            
            for(int i = 0; i < loops;i++){
                for(int j = 0; j<items.length;j++){
                    System.out.print(items[j][indices[j]] + " ");
                    indices[j] = (indices[j] + 1) % items[j].length;
                }
                System.out.println();
            }
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    
    A1 B1 C1 
    A2 B2 C1 
    A3 B1 C1 
    A1 B2 C1 
    A2 B1 C1 
    A3 B2 C1

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    smartin123 smartin123 ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    65
    Tom,
    vielen Dank, genau das hab ich gesucht.

    vg
    smartin123
     

  4. #4
    Allan Knox Allan Knox ist offline Grünschnabel
    Registriert seit
    Mar 2008
    Beiträge
    2
    Interessante Vorgehensweise.
    Leider werden aber nicht alle Kombinationen erstellt, wenn man z.B. das C-Array erweitert.

    Wenn man z.B. das Element C2 hinzufügt, also:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    Object[][] items = {
            {
                "A1","A2","A3"
            },
     
            {
                "B1", "B2"
            },
                    
            {
                "C1", "C2"
            }
    };
    ergibt die Ausgabe:
    A1 B1 C1
    A2 B2 C2
    A3 B1 C1
    A1 B2 C2
    A2 B1 C1
    A3 B2 C2

    A1 B1 C1
    A2 B2 C2
    A3 B1 C1
    A1 B2 C2
    A2 B1 C1
    A3 B2 C2

    Nach der Hälfte der Einträge werden die Kombinationen also wiederholt.

    Erwartet hätte ich (vermutlich jedoch in einer anderen Reihenfolge):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    A1 B1 C1 
    A2 B2 C2 
    A3 B1 C1 
    A1 B2 C2 
    A2 B1 C1 
    A3 B2 C2 
    A1 B1 C2 
    A2 B2 C1 
    A3 B1 C2 
    A1 B2 C1 
    A2 B1 C2 
    A3 B2 C1
    Ich habe es bisher noch nicht hinbekommen, den Algorithmus so zu erweitern, dass die untere Ausgabe erzeugt wird. Kann da jemand helfen ? Oder muß man dann doch ganz andere Wege gehen (z.B eine rekursive Funktion) ?

    Gruß
    J-P
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 04.12.08, 23:09
  2. Antworten: 12
    Letzter Beitrag: 13.09.07, 03:31
  3. Über URL Route berechnen
    Von Ultraflip im Forum PHP
    Antworten: 1
    Letzter Beitrag: 31.08.07, 13:51
  4. Algorithmus für Kombinationen
    Von Roman Locher im Forum Visual Basic 6.0
    Antworten: 12
    Letzter Beitrag: 28.12.06, 09:58
  5. Cosinus über Reihe berechnen
    Von Der O im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 30.04.05, 19:51