nicht transitive Paare ausgeben

Status
Nicht offen für weitere Antworten.

Taramsis

Bekanntes Mitglied
Hi Leute,

ich brauch dringend Eure Hilfe!!!
Mit Hilfe eines Freunds habe ich die folgende Methode erstellt, die ein zweidimensionales Array auf Transitivität überprüft!!
Java:
public void transitivelyTest(){
        ArrayList lastCheckedTupelArrayList = new ArrayList();
        Object[][]array = managerAlg.getCheckedNewTupelArrayKombo();
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                if (array[i][1].equals(array[j][0])) {
                    // Suche eine Verbindung array[i][0] -> array[j][1]
                    // falls nicht vorhanden, ist die Relation nicht transitiv
                    boolean transitiv = false;
                    for (int k = 0; k < array.length; k++) {
                        if (array[i][0].equals(array[k][0])
                            && array[j][1].equals(array[k][1])) {
                            transitiv = true;
                            lastCheckedTupelArrayList.add(array[i][0]);
                            lastCheckedTupelArrayList.add(array[i][1]);
                            lastCheckedTupelArrayList.add(array[j][0]);
                            lastCheckedTupelArrayList.add(array[j][1]);
                            lastCheckedTupelArrayList.add(array[k][0]);
                            lastCheckedTupelArrayList.add(array[k][1]);
//                            System.out.println("Verbindung von " + array[i][0]
//                                               + " -> " + array[i][1] + " und "
//                                               + array[j][0] + " -> " + array[j][1]
//                                               + " und " + array[k][0] + " -> "
//                                               + array[k][1]);
                                                // Es kann weiter nach der gleichen Konstellation
                                                // gesucht werden,
                                                // muss aber nicht
                        }
                        else if (array[i][0].equals(array[k][1])
                                 && array[j][1].equals(array[k][0])) {
                            transitiv = true;
                            lastCheckedTupelArrayList.add(array[i][1]);
                            lastCheckedTupelArrayList.add(array[i][0]);
                            lastCheckedTupelArrayList.add(array[j][1]);
                            lastCheckedTupelArrayList.add(array[j][0]);
                            lastCheckedTupelArrayList.add(array[k][1]);
                            lastCheckedTupelArrayList.add(array[k][0]);
//                            System.out.println("Verbindung von " + array[i][1]
//                                            + " -> " + array[i][0] + " und "
//                                            + array[j][1] + " -> " + array[j][0]
//                                            + " und " + array[k][1] + " -> "
//                                            + array[k][0]);
                            // Es kann weiter nach der gleichen Konstellation
                            // gesucht werden,
                            // muss aber nicht
                        }
                                            
                    }
                    if (!transitiv) {
                            System.out.println("relation is not transitive");
                            
                    }

                } 
            } 
        } 
        System.out.println("Transitive!!!" + lastCheckedTupelArrayList);
        int size = lastCheckedTupelArrayList.size();
        String[] lastCheckedTupelArray = new String[size];
        for (int i = 0; i < size; i++) {
            lastCheckedTupelArray[i]=(String) lastCheckedTupelArrayList.get(i);
        }
        managerAlg.setLastCheckedArray(makeUnique(lastCheckedTupelArray));
        //System.out.println(Arrays.toString(managerAlg.getLastCheckedArray()));

    }

private static String[] makeUnique(String array[]){
      return new LinkedHashSet<String>(Arrays.asList(array)).toArray(new String[0]);
    }

Wie Ihr sieht speichere ich das ganze in ein ArryList und führe eine makeUnique Methode aus!
Nun möchte ich, dass er das gleiche zweidimensionale Array untersucht und die nicht transitiven speichert.

Hintergrund ist, wenn ich 100 Elemente habe und diese zu paaren kombiniere und in meinem zweidimensionalen Array nun das Paar [1,100] fehlt, würde er mir oben dies als transitiv ansehen. Ich möchte aber in "lastCheckedTupelArrayList" nur die Elemente die zueinander transitiv sind. Wenn ich also bei einem negativen Transitivitäts-Test [1,100] herausbekomme kann ich diese ja aus "lastCheckedTupelArrayList" entfernen!

Ich bin am verzweifeln!!!!!!
 
Wie schon letztes mal: Eine (im mathematischen Sinne) präzisere Beschreibung dessen, was du machen willst, würde das ganze erheblich vereinfachen.

Bisher hast du dort (wenn ich mich recht erinnere) etwas, was überprüft, ob die Relation, die durch eine Menge von 2-Tupeln definiert ist, transitiv ist. Also ob die 2-Tupel dort genau alle Elemente einer transitiven Relation sind. Und du willst jetzt genau ... was rausfinden ???:L

BTW: Die makeUnique-Methode ist ja Toll 😀 Aber wenn es ohnehin um eine List geht, könnte man statt
Code:
        int size = lastCheckedTupelArrayList.size();
        String[] lastCheckedTupelArray = new String[size];
        for (int i = 0; i < size; i++) {
            lastCheckedTupelArray[i]=(String) lastCheckedTupelArrayList.get(i);
        }
        managerAlg.setLastCheckedArray(makeUnique(lastCheckedTupelArray));
auch einfach schreiben
Code:
        lastCheckedTupelArrayList = new ArrayList(new LinkedHashSet(lastCheckedTupelArrayList));
        managerAlg.setLastCheckedArray((String[])lastCheckedTupelArrayList.toArray(new String[0]);
 
Hi,

ich habe ein Wizard entworfen mit denn man Module erstellen, die eine zeitliche Länge haben und eine Piorität besitzen (von 1...8).
Dann kann man ein Scenario erstellen, hier wählt man seine gewünschten Module(müssen nicht alle sein). Dann kann man aussuchen welches Module gleichzeitig mit einem anderen Modul laufen kann. Die Module sind nach (x^2-x)/2 kombiniert.
Ich mach mal ein Beispiel das durch meinem Code nicht berücksichtigt wird:
gegeben sind die Module: m1,m2,m3,m4,m5,m6
folgende Kombinatonen gibt es: (ich speichere die kombos in einem zweidimensionalen Array)
m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6, m3m4, m3m5, m3m6, m4m5, m4m6, m5m6
nun wähle ich alles außer: m5m6

Mein Algorithmus sieht alle Module als transitiv an, da m5 und m6 zu anderen transitiv sind. Ich möchte aber dass er nur die jenigen Module speichert die auch zu den anderen transitiv sind!
Das klingt doch unmöglich!!!!!!!!;(
 
Ein Modul ist nicht transitiv. Ein Paar von Modulen ist auch nicht transitiv. Transitiv ist bestenfalls die Relation, die durch die jeweilige Menge der Paare von Modulen beschrieben wird.

Und bei der Menge
m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6, m3m4, m3m5, m3m6, m4m5, m4m6, OHNE m5m6
stehen (auch wenn man die transitive Hülle bildet) m5m6 nicht in Relation, weil m5 zu keinem anderen in der gegebenen Relation steht. (Alle zu m5, aber m5 zu keinem - oder soll vorher noch die "symmetrische Hülle" gebildet werden?)
 
Ich glaube ich mache mir das Leben einfach zu schwer! Ich bekomme ja schon das richtige Ergebnis, aber ich muss auch die Kombos die nicht ausgesucht wurden berücksichtigen!
Ich habe nun diese nicht ausgesuchten Kombos ebenfalls gespeichert und nun habe ich eine Fallunterscheidung gemacht.
Ich habe schon die funktionierende Fälle zusammen schwieriger ist es mit den anderen Fällen, da wenn z.B.:

einDimArray: m1,m2,m3,m4,m5,m6
zweiDimArray: m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6, m5m6
zweiDimAuswahlArray: m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6

zweiDimNichtAuswahlArray: m1m6, m5m6
einDimNichtAuswahlArray:m1,m5,m6

Dann muss ich ja sagen er solle schauen welches Element aus "einDimNichtAuswahlArray" kommt in jedem Tupel von "zweiDimNichtAuswahlArray" vor
-> dann ziehe diesen von "einDimArray" ab!

Wie kann ich den eine Anfrage stellen, ob ein Element in jedem Tupel vorkommt (Reflexivität gibts natürlich nicht)??
 
Ich glaube ich mache mir das Leben einfach zu schwer!
Davon bin ich auch überzeugt. Wenn du präzise beschreiben würdest, was du vorhast, dann würde man es wahrscheinlich einfach hinschreiben können.

Ich habe schon die funktionierende Fälle zusammen schwieriger ist es mit den anderen Fällen
Ja, das notorische Problem der nicht funktionierenden Fälle.... 😉

einDimArray: m1,m2,m3,m4,m5,m6
zweiDimArray: m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6, m5m6
zweiDimAuswahlArray: m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6

zweiDimNichtAuswahlArray: m1m6, m5m6
einDimNichtAuswahlArray:m1,m5,m6

OK.
einDimArray ist die Menge M, um die es erstmal geht.
zweiDimArray ist eine transitive Relation auf dieser Menge
zweiDimAuswahlArray ist "irgendeine" Teilmenge von MxM
zweiDimNichtAuswahlArray ist MxM\zweiDimAuswahlArray, also die transitive Relation OHNE die Elemente aus zweiDimAuswahlArray - einleuchtend.


Dann muss ich ja sagen er solle schauen welches Element aus "einDimNichtAuswahlArray" kommt in jedem Tupel von "zweiDimNichtAuswahlArray" vor
-> dann ziehe diesen von "einDimArray" ab!

Und dieses Element wäre in diesem Fall NUR m6 !?


Wie kann ich den eine Anfrage stellen, ob ein Element in jedem Tupel vorkommt (Reflexivität gibts natürlich nicht)??


Indem du eine Methode schreibst, die das macht!!! 😱 :bahnhof:
Code:
private static boolean istInAllenTupeln(String element, String tupelMenge[][])
{
    for (String tupel[] : tupelMenge)
    {
        if (!tupel[0].equals(element) &&
            !tupel[1].equals(element))
        {
            return false;
        }
    }
    return true;
}
 
einDimArray: m1,m2,m3,m4,m5,m6

zweiDimArray: m1m2, m1m3, m1m4, m1m5, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6, m5m6
zweiDimAuswahlArray: m1m2, m1m3, m1m4, m1m5, m1m6, m2m3, m2m4, m2m5, m2m6,
m3m4, m3m5, m3m6, m4m5, m4m6

zweiDimNichtAuswahlArray: m1m6, m5m6

einDimNichtAuswahlArray:m1,m5,m6
Oben hatte ich in "zweiDimAuswahlArray" m1m6 nicht herausgenommen!

Danke Dir!
Ich habe mir jetzt genau den Algorithmus überlegt den ich umsetzen muss hierfür benötige ich jedoch ne Strathilfe!

Erzeuge ArrayListe tempList!
Erzeuge ArrayListeListe tempList2!
nehme 1.Element aus "einDimNichtAuswahlArray" und führe Vgl. mit "zweiDimNichtAuswahlArray"
-> (if) kommt es in jedem Tupel vor
- speichere es in "tempList" -- stoppe Schleife
-> (else if) kommt es nur einmal vor
- speichere es in "tempList"
-> (else if) kommt es mehr als "zweiDimNichtAuswahlArray.length/2" vor
- lösche "tempList" und speichere "Element" es in "tempList"
- bestimme "partnerTupel" von "Element"
- ziehe "partnerTupel" + "Element" von "einDimNichtAuswahlArray" ab und
speichere es in "tempList2"
- (if) ist "tempList2.length" > 2
- lösche von "zweiDimNichtAuswahlArray" alle Tupel in dem "Element"
vorkommt -> speicher Rest in "zweiDimNichtAuswahlArray2"
- nehme aus "zweiDimNichtAuswahlArray2" jeweils die ersten Elemente und
füge diese zu "tempList" -- stoppe Schleife
- (else) nehme erstes element aus "tempList2" und füge es in "tempList" hinzu
-- stoppe Schleife
-> (else if) kommt es mehr als zwei mal vor
- speichere diese in "tempList"
- bestimme "partnerTupel" von "Element"
- lösche von "zweiDimNichtAuswahlArray" alle Tupel in dem "Element"
vorkommt -> speicher Rest in "zweiDimNichtAuswahlArray2" und
betimme "einDimNichtAuswahlArray2"
-Vgl. "einDimNichtAuswahlArray2" mit "zweiDimNichtAuswahlArray2"
-> (if) kommt es mehr als zwei mal vor
- speichere diese in "tempList"
- (else)
- speichere diese in "tempList"

Ich hoffe dies berücksichtigt alles!
Klingt einfach!!:lol:
 
Ich blick ebenfalls nichts mehr xD

Hatte zwar Transitivität in der Uni, aber das ist mir jetzt dann doch irgendwie zu hoch ^^
 
Ich weiß😳

Ich werds mal angehen und wenn ich fragen bzgl. einer Stelle habe melde ich mich nochmal!

Vielen Dank an alle!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben