Datentypen Datentransformation und Matching

coffeecup

Aktives Mitglied
Hi ;)

Ich habe Daten aus R geladen:
[FACTOR {levels=("m.1","m.10","m.10","m.1"),ids=(0,83,94,11)}]
Mein Ziel ist es, die Daten zuerst so darzustellen:

0 m.1
83 m.10
94 m.10
11 m.1

und dann am ende , sollte ich einen match der "m"s haben, also alle m1 sollen zusammengefasst werden:
m.1 ={0,11}

wie kann ich das machen? wie kann ich den obrig angeführten Datensatz irgendwie in eine Matrix form bringen?
und dann so ein Match vollziehen?

Dankeschön!

liebe Grüße
 
S

SlaterB

Gast
> wie kann ich das machen?

wie nicht? welches Problem besteht?
überlege dir irgendeine Darstellung, zwei Arrays, ein zweidimensiones Array, oder Listen, oder eine Map falls die Ids eindeutig sind,
zur Vereinfachung vielleicht eine neue Klasse Eintrag, die eine Id und den zugehören Wert aufnimmt oder was immer das ist,
dann nur ein Array davon

Ausgabe als Durchlauf des Arrays/ der Liste/ der Map,
Suchen nach einem Wert usw.,
das sind doch normale Vorgänge die man einfach kodieren kann
 

coffeecup

Aktives Mitglied
Das Problem das ich habe ist, dass ich nicht verstehe, wie ich diese "Werte" in einen doppelarray Übertragen soll...
Es handelt sich ja hier nicht um einzelne Strings, sondern um nur einen...
 
S

SlaterB

Gast
gut, das ist ein interessanterer Aspekt,

das Parsen hängt auch davon ab, wieviel du von der Ursprungsform des Strings weißt,
sind "levels=(" und "),ids=(" immer genau so vorhanden wie in dem Beispiel?
dann kannst du deren Positonen bestimmen und
"m.1","m.10","m.10","m.1" sowie 0,83,94,11 herausschneiden, siehe String-Methoden, indexOf(), substring() usw.

danach wirds einfacher, split(",") liefert jeweils schon einer 4er Array, evtl. noch die Anführungs- und Leerzeichen entfernen usw.
 

coffeecup

Aktives Mitglied
danke SlaterB!!
Aber wie kann ich die Werte zusammenführen , bzw. speichern, wenn ich den array gesplittet habe?
Leider kann ich sie nicht einzeln ausschneiden, weil die Länge und Anzahl der Werte im "Anfangsstring" stark variiren...

String A="[FACTOR {levels=('m.1','m.10','m.100','m.101','m.103'),ids=(0,83,94,11,98)}]";
String[] splittArray = A.split("levels");

System.out.println(splittArray[0]);
System.out.println(splittArray[1]);

String[] End = splittArray[1].split("ids");

System.out.println(End[0]);
System.out.println(End[1]);

Aber was nun?
 

Michael...

Top Contributor
Der Ansatz von SlaterB bestand ja darin, erst einmal die interessanten Inhalte per indexOf und substring "herauszuschneiden":
Java:
String text="[FACTOR {levels=('m.1','m.10','m.100','m.101','m.103'),ids=(0,83,94,11,98)}]";
text = text.replace("\\s", ""); //Eleminieren aller Leerzeichen und sonstiger whitespaces

int start = text.indexOf("levels=(") + 8; // 8 entspricht "levels=(".length();
int end = text.indexOf("),ids=", start);
System.out.println(text.substring(start, end));

Und auf dieses Resultat anschliessend split() anzuwenden.
 
Der folgende Code schneidet alles überflüssige weg. Du hast dann zwei arrays, die einmal die komischen Strings (m) und die seltsamen Zahlen (id) enthalten. Nachtrag: Das ist ein Schnellhack und nicht besonders stilvoll. Wenn Du sehr viel einliest, solltest Du Dir wegen der vielen Stringoperationen überlegen, ob Du zwischendurch mit StringBuildern arbeitest.

Java:
package splitlevels;

import java.util.*;

public class Main {
    
    HashMap<String, int[]> hm = new HashMap<String, int[]> ();
    
    static String muellWech (String s) {
        boolean somethingChanged = true;
        while (somethingChanged) {
            somethingChanged = false;
            if (s.startsWith("'") || s.startsWith ("(")) {
                s = s.substring(1);
                somethingChanged = true;
            }
            if (s.endsWith("'") || s.endsWith ("}")
                    || s.endsWith (")") || s.endsWith ("]")) {
                s = s.substring (0,s.length()-1);
                somethingChanged = true;
            }
        }
        return s;
    }

    public static void main(String[] args) {
        // Das würdest Du eigentlich erst aus einer Datei einlesen.
        String input = "[FACTOR {levels=('m.1','m.10','m.100','m.101','m.103'),ids=(0,83,94,11,98)}]";
        // Grobe Vorsplittungen.
        String levelsAndid =input.split ("levels=")[1];
        String ids = levelsAndid.split ("ids=")[1];
        String levels = levelsAndid.split (",ids=")[0];
        // Die einzelnen Werte in arrays, immer noch "verunreinigt".
        String[] m = levels.split (",");
        String[] idstr = ids.split (",");
        // Die ids werden am Ende Integer-Werte, dafür schon mal Array anlegen.
        int[] id = new int[idstr.length];
        // Die Feinarbeit leisten, damit die Werte schier sind.
        for (int i = 0; i < m.length; i ++) {
            m[i] = muellWech (m[i]);
        }
        for (int i = 0; i < idstr.length; i ++) {
            id[i] = Integer.parseInt(muellWech(idstr[i]));
        }
        /* Nun die passenden Werte für jedes m aus id aussuchen, in ein
         * separates array speichern und am Ende in einer Hashmap ablegen
         * (zum Beispiel wie deklariert, also eine mit dem Key aus m und
         * als Value den Miniarray von ids, die zu dem jeweiligen m passen.
         * Dafür bin ich jetzt aber zu faul...
        */
    }

}
 
Zuletzt bearbeitet:

Shulyn

Bekanntes Mitglied
ich will auch ^^

[Java]
public static void main(String[] a) {
String text="[FACTOR {levels=('m.1','m.10','m.100','m.101','m.103'),ids=(0,83,94,11,98)}]";
String mms = text.substring(text.indexOf("(")+1, text.indexOf(")"));
String mms_array[] = mms.split(",");
for(int i = 0; i < mms_array.length; i++) {
mms_array = mms_array.substring(1,mms_array.lastIndexOf("'"));
}
String ids = text.substring(text.lastIndexOf("(")+1, text.lastIndexOf(")"));
String ids_array[] = ids.split(",");
for(int i = 0; i < mms_array.length && i < ids_array.length; i++){
System.out.println(ids_array + " " + mms_array);
}
//und dann am ende , sollte ich einen match der "m"s haben, also alle m1 sollen zusammengefasst werden:
// m.1 ={0,11}
// Das musst du jetzt noch selber machen ;)
}
[/Java]

//edit: Das meine Tabs immer verschluckt werden müssen ;(
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben