Sammeltopic für kurze Codingfragen

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Ich mal wieder.
    Aber dieses Mal Vorbereitung für ein Uniprojekt und daher etwas, womit sich hier einige sicher sogar sehr gut auskennen: JavaScript.


    Folgendes. Ich habe ein XML Dokument, dass so aussieht:

    XML: store_table
    <?xml version="1.0" encoding="UTF-8"?><warehouse>	<storage>		<name>Area A</name>		<length>20</length>		<width>40</width>	</storage>	<ware>		<item>			<num>1</num>			<loc_x>190</loc_x>			<loc_y>5</loc_y>			<loc_z>70</loc_z>			<width>3</width>			<height>3</height>			<depth>2</depth>		</item>		<item>			<num>2</num>			<loc_x>35</loc_x>			<loc_y>5</loc_y>			<loc_z>10</loc_z>			<width>1</width>			<height>1</height>			<depth>1</depth>		</item>	</ware></warehouse>


    Nur eigentlich nicht mit nur zwei Einträgen, sondern 500.


    Nun möchte ich mit JavaScript all die Einträge, bei denen die loc_x 35 ist ausgeben lassen und zwar als eine Liste der "num" einträge.


    Und ich habe keine Ahnung, wie ich das machen soll.


    Ich habe mal angefangen simple Grundlagen, wie "schau dir erst einmal alle "item"s an" zu versuchen anhang des XML DOM Tutorials von W3 zu erwarbeiten... Aber ich weiß schon, warum ich seit Jahren eine Abneigung gegen JS (und Java) habe ^^"


    So sieht bisher mein Code aus. Bitte nicht lachen. Ich schäme mich auch so schon genug :(
    Mir wird als "length" 0 ausgegeben.


  • Dafür bietet sich perfekt XPath an. Ist deutlich intuitiver als die ganzen DOM-Methoden. Einfach ein XPath-Query absetzen und fertig. Den fertigen XPath-Query hab ich sogar schon erstellt, weil das 'n ziemlich simples Beispiel ist: //loc_x[text() = '35']/parent::item/num/text()
    Wie man damit jetzt an die Elemente kommt, ist in der Einführung zu XPath im MDN recht gut erklärt.

  • Hallo zusammen,


    ich stehe bei einer Aufgabe mit 2D-Arrays im Java gerade voll auf dem Schlauch..



    Java
    for(int i=0; i < anzahlSpalten; i ++){
                int total = 0;
                for(int j =0; j < laufzeiten.length; j ++){
                    total += laufzeiten[j][i];
                }
    }

    Aufgabe: Ich muss in einem 2D-Array, alle Werte einer Spalte aufsummieren, wie schaffe ich es nun, dass ich als Bedingung für die erste for Schleife jeweils die Anzahl der Spalten auslesen kann, ohne dass ich dies als festen Wert speichere, ich müsste ja jeweils für jede Zeile die Anzahlspalten ermitteln, jedoch wird in dieser Schleife nicht mit dem Zeilenindex gearbeitet? (die Variable anzahlSpalten in Zeile 1 soll vermieden werden)

  • Wenn ich dein Problem richtig verstanden habe, dann ist die Lösung recht trivial:

    Java
    class main {	public static void main(String[] args) {		int[][] meinArray = { {  1,  2,  3,  4,  5,  6 }		                    , {  7,  8,  9, 10, 11, 12 }		                    , { 13, 14, 15, 16, 17, 18 }		                    };		int spaltenIndex = 1; // Welche Spalte soll aufsummiert werden?		int total = 0;		for (int reihe = 0; reihe < meinArray.length; reihe++) {			total += meinArray[reihe][spaltenIndex];		}		System.out.println(total);	}}

    Erzeugt wie erwartet die Ausgabe 24, da 2 + 8 + 14 = 24.


    Wenn du das Ergebnis für alle Spalten einzeln berechnen möchtest, kannst du so vorgehen, wenn dein Array wohlgeformt ist und jede Reihe die selbe Anzahl an Elementen besitzt:


    Java
    class main {	public static void main(String[] args) {		int[][] meinArray = { {  1,  2,  3,  4,  5,  6 }		                    , {  7,  8,  9, 10, 11, 12 }		                    , { 13, 14, 15, 16, 17, 18 }		                    };		for (int spalte = 0; spalte < meinArray[0].length; spalte++) {			int total = 0;			for (int reihe = 0; reihe < meinArray.length; reihe++) {				total += meinArray[reihe][spalte];			}			System.out.println("Summe der Spalte "+spalte+": "+total);		}	}}

    Wir nutzen hier also meinArray[0].length, da wir wissen, dass alle Reihen die gleiche Anzahl an Elementen haben.
    Dies erzeugt dann folgende Ausgabe:

    Code
    Summe der Spalte 0: 21
    Summe der Spalte 1: 24
    Summe der Spalte 2: 27
    Summe der Spalte 3: 30
    Summe der Spalte 4: 33
    Summe der Spalte 5: 36


    Ist dies nicht der Fall, müsstest du noch etwas mehr Arbeit reinstecken:

    • Reihe mit den meisten Elementen finden
    • Diesen Wert statt meinArray[0].length nutzen
    • In der inneren Schleife prüfen, ob spalte größer oder gleich meinArray[reihe].length ist und wenn ja, dann 0 addieren.
  • Wenn es jetzt aber unterschiedliche Spaltenlängen gibt, gibt es dann doch einen IndexOutOfBound?

  • Also nochmals zu der Relationalen Algebra im Bereich Datenbanken:


    1. Kann der ungleich-Operator <> beim select angewendet werden?


    2. Ich habe die Relationen:

    • Fährt(Skifahrer/in,Rennen) Bsp. (Hans Muster, Wengen)
    • GehörtZu(Rennen,Disziplin) Bsp. (Wengen, Slalom)
    • Spezialisiert(Skifahrer/in,Disziplin) Bsp. (Hans Muster, Slalom)

    und muss dabei folgende Aufgabe lösen:
    Skifahrer/innen, die auf alle Disziplinen spezialisiert sind ("Allrounder")


    Ich brauche lediglich einen Input, wie ich die Menge aller Disziplinen mit den Fahrern vergleichen kann..


  • Zu erstens, ich möchte Beispielsweise alle Fahrer selektieren, die nicht auf Slalom spezialisiert sind. Dies müsste doch mit dem select Disziplin <> Slalom funktionieren?

    Im SELECT der Abfrage gehören nur die Tabellen/Spaltennamen hin.


    In deinem Fall wärs wohl


    SELECT *
    FROM Spezialisiert
    WHERE Disziplin <> Slalom


    Für genau diese Fälle gibts das WHERE

  • Ich muss mal wieder etwas nachfragen. *seufz*


    JavaScript String Vergleiche.


    Ich habe hier zwei Sachen: Ein Array, der Strings beinhaltet und ein three.js Objekt, dass einen String als "typ" beinhaltet.


    Wenn jetzt der String dem anderen String beeinhaltet ist, dann soll mit dem objekt was passieren.
    Problem ist... Irgendwie erkennt er die Strings nicht als identisch - obwohl sder eine String im Array eigentlich aus derselben Quelle kommt und damit an sich dieselben übergeben werden.


    Hier der Code von der Funktion:


    JavaScript
    function filter_visual() {	len = checked_types.length;	ob_len = objects.length;	var object_type;	var check_type;	for (var i = 0; i < ob_len; i++) {		objects[i].material.opacity = 0.3;		object_type = objects[i].typ.replace(" ", "").replace("\n", "").toLowerCase();		//console.log("Typ: " + objects[i].typ);		for (var j = 0; j < len; j++) {			//console.log("Checked: " + checked_types[j]);			check_type = checked_types[j].replace(" ", "").replace("\n", "").toLowerCase();			console.log(object_type + " = " + check_type + "?");			console.log(check_type.localeCompare(object_type));			//console.log(object_type.valueOf());			if (check_type.valueOf() === object_type.valueOf()) {				console.log("Übereinstimmung");				//objects[i].material.opacity = 1.0;			}		}	}}


    Und hier einmal die Konsolen Ausgabe von wegen "localeCompare".


    Code
    konsole = konsole? 
    -1
    empty = konsole? 
    1 
    konsole = konsole?
    -1
    computer = konsole?
    1

    Warum ist "konsole".localeCompare("konsole") -1? Es müsste 0 sein. >____<

  • Die wahrscheinlichste Erklärung ist, dass einer der Strings nicht druckbare Zeichen enthält, wobei ich spontan auf den Wagenrücklauf tippen würde. Wenn es der ist, dann kannst du den einfach mit replace entfernen.

    Code
    check_type = checked_types[j].replace(" ", "").replace("\n", "").replace("\r","").toLowerCase();

    Sinnvoller wäre allerdings mit einer Regex beispielsweise alle nicht-alphanumerischen Zeichen zu entfernen.

  • Que: Funktioniert.


    Wir haben gerade noch einmal ein Problem.


    Wir haben ein JS Applet in einem Windowsprogram. Das ist eine kleine visuelle Sache in einem Fenster eingebunden, die auf JS läuft. Das soll abfangen, wenn die Tastatur was macht. Problem: Wir müssen IMMER erst den Block mit der visuellen Sachen anklicken, damit es funktioniert.
    Kann man bei Java irgendwie so programmieren, dass es IMMER Tastatureingaben abfängt?