Get-ADUser -Filter {(Enabled -eq "true") -and (Department -like "Personal")}
...zur Antwort

Access Button soll Code ausführen?

Sorry, für die Frage, ist bestimmt richtig leicht.

Kenne mich halt leider null mit access aus, habe am Montag das erste mal in meinem Leben was davon gehört und befinde mich zu Zeit in einem Praktikum, ich soll mir alles selbst beibringen.

Ich möchte nun einen Button erstellen, der dann den letzten Datensatz dupliziert und zwar so oft, wie man angibt, also man gibt z.b. eine 5 an, dann dupliziert er den Datensatz 5 mal.

Der PK ist ein Autowert und ich nehme an, das der beim duplizieren sich ändert.

-----------------------

Allerdings habe ich jetzt das Problem, dass wenn ich einen Button erstelle, nur der Assistent erscheint und da habe ich keine Lösung für mein Problem gefunden.

Also wollte ich den Button eine Makro ausführen lassen, doch auch da habe ich nur die vorgegebenen Möglichkeiten entdeckt, welche mir aber auch nicht weiterhelfen.

Ich habe die Makro dann in eine Visual Basic Datei konvertiert.

Da kann ich zwar jetzt einen Code eingeben, aber ich kann die Visual Basic datei nicht mit einem Button verknüpfen.

Da ich auch keine Ahnung vom Coden habe, habe ich mir dafür einen Code im Internet rausgesucht, der anscheinend funktionieren soll:

Private Sub Befehl227_Click()
  Dim lngI    As Long
  Dim lngIMax   As Long
  Dim strEingabe As String
  
  DoCmd.RunCommand acCmdSelectRecord
  DoCmd.RunCommand acCmdCopy
  strEingabe = InputBox("Wie oft?", , 1)
  'Benutzereingabe wurde abgebrochen
  If StrPtr(strEingabe) = 0 Then Exit Sub
  lngIMax = Val(strEingabe)
  For lngI = 1 To lngIMax
    DoCmd.RunCommand acCmdPasteAppend
  Next lngI
End Sub

----------------------

Hoffe mir kann wer weiterhelfen und bevor jmd sagt, man muss keine Datensätze kopieren! -> das ist leider genau die Aufgabe die mir gegeben wurde, ich verstehe den Sinn dahinter auch nicht.

Es handelt sich nämlich um Installationskeys, welche unterschiedlich oft einsetzbar sind, man soll also den Key und paar andere Sachen angeben und dann die Anzahl angeben, dementsprechend oft soll nun der Datensatz kopiert werden, damit man zu jeden einzeln das einlöse-Datum eintragen kann.

Hatte eigentlich erst eine Tabelle mit dem Key und so erstellt und mit einer anderen Tabelle verknüpft, in welcher die einlöse-Datums drinnen stehen, dann kann man ja eigentlich zu jedem Key, beliebig viele Datums zuordnen, aber das soll ich anders machen und zwar mit dem duplizieren.

Wäre also cool, wenn mir wer paar tipps geben könnte und bitte berücksichtigt, bei euren Antworten, dass ich noch ein absoluter Anfänger bin.

Danke schonmal im Vorraus

...zur Frage

Um einem Button einen Code zuzuordnen, machst du einfach einen Rechtsklick auf den Button und dann auf Ereignis... dann geht ein Fenster auf, wo du auf "Code-Generator" klickst.

Alternativ kannst du das Eigenschaftenfenster vom Button öffnen und da in die Registerkarte "Eigenschaften" gehen und einen Doppelklick bei "Beim Klicken" machen. Dann steht "[Ereignisprozedur]" drin und wenn du auf die drei Punkte klickst, wird auch der VBA-Editor geöffnet.

Zum eigentlichen Problem: Würde es auch gehen, wenn du den Key und die Anzahl in einem Formular eingibst und dann einfach entsprechend viele Einträge in eine Tabelle geschrieben werden, anstatt dass du einen Eintrag per Hand in die Tabelle schreibst und ihn dann mit der Prozedur mehrmals kopierst?

Wenn du schon ein Formular mit einem Button hast, kannst du da einfach zwei Textfelder anlegen (ich nenne sie mal txtKey und txtCount) und kannst dann für den Button (ich hab ihn hier mal btnInsert genannt) diese Prozedur rein machen:

Option Compare Database
Option Explicit

Private Sub btnInsert_Click()
    Dim count As Integer, i As Integer
    
    ' Textinhalt in Zahl umwandeln, um sicherzugehen, dass eine Zahl eingegeben wurde
    count = Me.txtCount.Value
    
    ' Sicherstellen, dass etwas eingegeben wurde
    If Me.txtKey = "" Then
        MsgBox "Bitte einen Key eingeben"
        Exit Sub
    End If
    
    If count = 0 Then
        MsgBox "Bitte eine Anzahl eingeben"
        Exit Sub
    End If
    
    ' Daten einfügen
    Dim RS As DAO.Recordset
    Set RS = CurrentDb.OpenRecordset("KeyAssignments")
    For i = 1 To count
        ' Man könnte auch currentDB.execute(SQL-Befehl) nehmen, aber das ist anfällig für SQL-Injection Attacken
        RS.AddNew
        RS!Key = Me.txtKey
        RS.Update
    Next i
    
    MsgBox "Es wurden " & count & " Einträge mit dem Key """ + Me.txtKey + """ eingetragen."
End Sub
...zur Antwort

Die Formel muss auch nicht in das Dropdown-Feld, sondern dahin, wo das x erscheinen soll.

=WENN(A1="x";"x";"")

Statt A1 muss halt die Zelle rein, wo das Dropdown-Feld ist.

...zur Antwort

127.0.0.1 ist der localhost, also dein eigener PC. Wenn du auf deinem PC also keinen Webserver laufen hast, ist es logisch, dass Chrome dir anzeigt, dass die Webseite nicht geladen werden kann.

Wahrscheinlich reicht es, wenn du eine andere Startseite einstellst. Das geht in Chrome unter der Adresse chrome://settings/onStartup

...zur Antwort

Wie kann ich button Ausrichten (Python)?

Ich wollte in folgendem Code den Button abstand entfernen, damit diese nicht so eine große lücke haben.

from tkinter import *
import random
from tkinter import messagebox

root = Tk()
root.title('Lock')
root.geometry('400x780')

one_btn = Button(root, text='1', command=one_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
two_btn = Button(root, text='2', command=two_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
three_btn = Button(root, text='3', command=three_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
four_btn = Button(root, text='4', command=four_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
five_btn = Button(root, text='5', command=five_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
six_btn = Button(root, text='6', command=six_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
seven_btn = Button(root, text='7', command=seven_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
eight_btn = Button(root, text='8', command=eight_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
nine_btn = Button(root, text='9', command=nine_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
plus_btn = Button(root, text='+', command=plus_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
minus_btn = Button(root, text='-', command=minus_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
mult_btn = Button(root, text='*', command=mult_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=10)
div_btn = Button(root, text='/', command=div_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=30)
square_btn = Button(root, text='^', command=square_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3', width=30)



one_btn.grid(row=0, column=0, pady=0, padx=0)
two_btn.grid(row=0, column=1, pady=0, padx=0)
three_btn.grid(row=0, column=2, pady=0, padx=0)
four_btn.grid(row=1, column=0, pady=0, padx=0)
five_btn.grid(row=1, column=1, pady=0, padx=0)
six_btn.grid(row=1, column=2, pady=0, padx=0)
seven_btn.grid(row=2, column=0, pady=0, padx=0)
eight_btn.grid(row=2, column=1, pady=0, padx=0)
nine_btn.grid(row=2, column=2, pady=0, padx=0)
plus_btn.grid(row=0, column=3, pady=0, padx=0)
minus_btn.grid(row=1, column=3, pady=0, padx=0)
mult_btn.grid(row=2, column=3, pady=0, padx=0)
div_btn.grid(row=3, column=1, pady=0, padx=0)
square_btn.grid(row=3, column=2, pady=0, padx=0)


root.call('wm', 'attributes', '.', '-topmost', '1')
root.mainloop()
...zur Frage

Du kannst dir das grid-Layout so vorstellen, als wenn du eine Tabelle hättest, wo in jede Zelle ein Steuerelement reinkommt. Die Spaltenbreiten werden also immer an das größte Element angepasst. Da du für den div_btn und den square_btn eine andere Breite, als für alle anderen angegeben hast, wird die Spalte an die beiden Buttons angepasst und es entsteht die Lücke. Wenn du die beiden auch auf Breite 10 setzt, sieht es gut aus.

Ich denke mal, du willst die beiden Buttons unter den Zahlen haben und so breit, wie zwei Zahlenbuttons. Dafür nimmst du am besten bei der Erstellung die width raus, damit die Breite automatisch berechnet wird und fügst dann beim grid die parameter 'columnspan=2' und 'sticky="we" ' hinzu.

div_btn = Button(root, text='/', command=div_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3')
square_btn = Button(root, text='^', command=square_btn_press, activebackground='#3a3b3c', background='#2a2b2c', fg='#7a7b7c', height='3')

...

div_btn.grid(row=3, column=0, pady=0, padx=0, columnspan = 2, sticky = "we")
square_btn.grid(row=3, column=2, pady=0, padx=0, columnspan = 2, sticky = "we")
...zur Antwort

Ich denke mal, ein Hintergrundbild zu malen und einen Ball aus der Sprite-Bibliothek rauszusuchen dürfte kein großes Problem sein, oder?

Dann erstellst du einfach ein kleines Programm, was den Ball in eine zufällige Richtung zeigen lässt und was dann eine Endlosschleife startet, in der der Ball bewegt wird und geprüft wird, ob eine Farbe berührt wird:

Und was du in die beiden Abprallen-Blöcke schreiben musst, steht über der Aufgabe. Zumindest den links/rechts-Teil kann man auf dem Bild noch lesen. Ich bin mir ziemlich sicher, dass der oben/unten Teil da auch steht.

...zur Antwort

Ich hab ein paar Anläufe gebraucht, bis ich kapiert hab, was überhaupt zu tun ist. Wie Mathmaninoff schon sagt, wäre eine kontinuierliche Bewegung schöner. Und was ich bei der Steuerung besser fände: Mach es so, dass man auch zweimal schnell hintereinander links oder rechts drücken kann. Bis jetzt muss man immer warten, bis der Sound für die links/rechts Bewegung abgespielt ist, bevor man nochmal links/rechts drücken kann. Benutze da lieber "start sound" anstatt "play sound until done"

...zur Antwort

Das kurze duschen nach der Sauna kann man ja kaum duschen nennen. Da hältst du kurz die Luft an und lässt ein paar Sekunden lang das eiskalte Wasser auf dich raufprasseln, um dich direkt danach ins Handtuch einzukuscheln. Also die Dusche ist vorbei, bevor du überhaupt richtig drüber nachdenken kannst.

Ich denke aber, selbst wenn die normale Dusche bei den Umkleiden auch gemischt wäre, würde es mich nicht stören. Man sieht oder zeigt da ja auch nicht mehr, als in der Sauna selbst.

...zur Antwort

Ein paar Probleme:

  1. Dein Ergebnisarray "ia" erstellst du mit der gleichen Länge, wie das Wort, in dem du suchst. In deinem Beispiel ist das Array also 6 Stellen lang, auch wenn du nur zwei Ergebnisse findest.
  2. Du prüfst in jedem Schleifendurchlauf, ob find irgendwo in s auftaucht. Also wenn der Suchbegriff nur einmal enthalten ist, wird das if bei jedem Schleifendurchlauf ausgeführt.

Den Rest hat dir regex9 schon erklärt.

Ich würde den String am ehesten mit regulären Ausdrücken durchsuchen. Da wird dir für jeden Fund ein Objekt ausgespuckt, was allerlei Infos hat (wo fängt es an, wo hört es auf, welche Gruppen sind drin, wo fangen die jeweils an oder hören auf...) und du kannst die einfach in ein int[] packen.

Ausführlich mit Kommentaren (man könnte das auch in einer Zeile machen):

public static int[] getIndicies(String s, String find) {
    // Wir benutzen ein Regex-Pattern
    return Pattern
            // und suchen nach find
            // Das "Pattern.quote" ist dafür da, dass man auch nach Zeichen
            // suchen kann, die eigentlich Regex-Steuerzeichen sind
            // Mit Pattern.CASE_INSENSITIVE ist Groß-/Kleinschreibung egal
            .compile(Pattern.quote(find), Pattern.CASE_INSENSITIVE)
            // im String s
            .matcher(s)
            // Dann nehmen wir uns alle Ergebnisse
            .results()
            // Und nehmen uns daraus die start-indizes
            .mapToInt(result -> result.start()) // oder MatchResult::start
            // und wandeln das in ein int[] um, damit wir es zurückgeben können
            .toArray();
}

Falls das eine Schulaufgabe ist und du keine regulären Ausdrücke benutzen darfst und auch keine Objekte, wie z.B. eine List benutzen darfst, kannst du die Funktion so bauen, dass sie immer ab dem letzten Vorkommen des Suchbegriffs weitersucht. Und du musst mitzählen, wie viele Ergebnisse du gefunden hast, damit du am Ende nur die gefundenen Ergebnisse zurückgibst:

public static int[] getIndicies(String s, String find) {
    // beide Parameter in lowerCase umwandeln, damit die Suche ohne
    // Beachtung der Groß-/Kleinschreibung geschieht
    s = s.toLowerCase();
    find = find.toLowerCase();
    // Ergebnisarray erstellen. Die maximale Anzahl an Ergebnissen
    // kann nur so viel sein, wie der String s lang ist.
    int[] indices = new int[s.length()];
    // in count zählen wir einfach, wie oft was gefunden wurde
    int count = 0;
    
    // Suchstring suchen
    int previousIndex = s.indexOf(find);
    // So lange der Suchstring gefunden wird
    while (previousIndex >= 0) {
        // letzten Fund zum Array hinzufügen
        // und Zähler erhöhen
        indices[count++] = previousIndex;
        // und ab dem letzten Fund nochmal suchen
        previousIndex = s.indexOf(find, previousIndex + 1);
    }
    
    // Nur die gefundenen Stellen zurückgeben 
    return Arrays.copyOf(indices, count);
}
...zur Antwort

Naja, du hast fest in deinem Code stehen, dass er "0.1+ BTC" anzeigen soll. Die URL, die du dir da rausgesucht hast, gibt leider eine komplette Webseite zurück. Wenn du Daten automatisch verarbeiten willst, geht das einfacher mit einer Web-Api (z.B. die von Blockchain.info. Die Dokumentation kannst du dir hier ansehen: https://www.blockchain.com/api/blockchain_api)

Ich weiß nicht, ob du mit deinem Programm am Ende nur deine Freunde verarschen willst, oder ob du wirklich denkst, dass du so an Bitcoins kommst, aber mit der Bitcoin-Adresse kannst du nur den Kontostand der jeweiligen Adresse anschauen. Um an die Bitcoins zu kommen, bräuchtest du den privaten Schlüssel zu der Adresse.

So kannst du z.B. den neuesten Block auslesen und kriegst damit gleich mehrere Adressen mit Bitcoins (ohne dass du dich durch haufenweise leere Konten kämpfen musst)

import requests

def get_block_outputs(block_hash):
    block_data = requests.get("https://blockchain.info/rawblock/" + block_hash).json()
    transactions = block_data["tx"]
    out_data = [tx["out"] for tx in transactions]
    # Die Scripts von Transaktionen ohne Adresse können leider nicht berücksichtigt werden
    out_addresses = [record["addr"] for output in out_data for record in output if "addr" in record.keys()]
    return out_addresses

# Neuesten Block ermitteln und alle Ausgangsadressen extrahieren
latest_block_hash = requests.get("https://blockchain.info/latestblock").json()["hash"]
addresses = get_block_outputs(latest_block_hash)

# Immer nur 100 Adressen auf einmal einlesen
balance_data = dict()
while len(addresses) > 0:
    balance_data.update(requests.get("https://blockchain.info/balance?active=" + "|".join(addresses[:100])).json())
    addresses = addresses[100:]

# Ergebnisse ausgeben    
for key, value in balance_data.items():
    print(f"{key}: {value['final_balance']} sats ({value['final_balance']/100000000} BTC)")

print("======================================================")
total = sum([address["final_balance"] for address in balance_data.values()])
print(f"Total: {total/100000000} BTC")
...zur Antwort

Leere Datei erstellen:

type nul > C:\temp\text.txt

Datei mit Text erstellen:

echo Ich bin ein Text>C:\temp\text.txt

Zeilen an Datei anfügen:

echo Ich bin die zweite Zeile>>C:\temp\text.txt

Input in eine Variable schreiben (Achtung, keine Leerzeichen um das Gleich-Zeichen machen):

set /p x=Gib mal was nettes ein: 

Ich würde dir aber allgemein empfehlen, dich nicht zu sehr mit Batch zu beschäftigen. Zumindest nicht, um etwas zu programmieren. Um einfach ein paar Programme nacheinander auszuführen, ist es gut, aber nicht wirklich für mehr. Für komplexere Sachen schau dir lieber Powershell an.

...zur Antwort

Kann sein, dass man das irgendwie über Reflect hinkriegt, aber es wäre sinnvoller, das Vorhaben an sich zu ändern.

Du könntest z.B. ein Array erstellen und damit sozusagen deine Variablen nummerieren:

int[] item = new int[10]; // int-Array mit 10 Elementen erstellen

// den Elementen Werte zuweisen
item[5] = 5;
item[3] = 9;
item[8] = 4;

Oder du benutzt eine HashMap, wo du quasi Variablen benennen kannst:

Map<String, Integer> variablen = new HashMap<>();
variablen.put("item_number_5", 5);

System.out.println(variablen.get("item_number_5"));

Allerdings kann man von einem String nicht mit Minus irgendwas entfernen (also dein Beispiel mit "item_number_5_abc" - "_abc" würde nicht gehen. Ich kann mir auch nicht vorstellen, dass das in JavaScript geht)

Erzähl mal, was du allgemein machen willst, vielleicht kann man dir dann besser helfen.

...zur Antwort

Ist jetzt ein bisschen die Frage, was du tatsächlich machen sollst. Sollst du die Klasse "Paar" bauen? Wenn ja, soll die Klasse Paar nur numerische Datentypen aufnehmen können? Oder sollst du einfach unabhängig von der Klasse Paar die Methode bauen?

Wenn die Methode unabhängig von der Klasse sein soll, brauchst du keine Generics. Da kannst du einfach als Datentyp das Interface Number angeben:

public double sumGenerisch(Number item1, Number item2) {
	return item1.doubleValue() + item2.doubleValue();
}

Wenn du die Klasse "Paar" bauen sollst und sie nur numerische Typen aufnehmen darf, musst du das im Kopf der Klasse angeben und brauchst der Methode "sumGenerisch" natürlich nichts mitgeben, weil die einfach die vorhandenen Daten der Klassenvariablen benutzen kann:

public class Paar<T extends Number, U extends Number> {
	protected T item1;
	protected U item2;
	
	public Paar(T item1, U item2) {
		this.item1 = item1;
		this.item2 = item2;
	}
	
	public double sumGenerisch() {
		return item1.doubleValue() + item2.doubleValue();
	}
}

Wenn die Klasse Paar alle Objekttypen, also auch nicht-numerische aufnehmen können soll, musst du in sumGenerisch prüfen, ob es Zahlen sind:

public class Paar<T, U> {
	protected T item1;
	protected U item2;
	
	public Paar(T item1, U item2) {
		this.item1 = item1;
		this.item2 = item2;
	}
	
	public double sumGenerisch() {
		if (item1 instanceof Number && item2 instanceof Number) {
			Number value1 = (Number) item1;
			Number value2 = (Number) item2;
			return value1.doubleValue() + value2.doubleValue();
		} else {
			throw new java.lang.IllegalArgumentException("item1 und item2 müssen das Interface \"Number\" implementieren.");
		}
	}
}
...zur Antwort

Ganz am Anfang hatten die Computer so wenig Speicherplatz, dass ein "Programmierprogramm" gar nicht drauf gepasst hätte. Z.B. der ENIAC hatte eine Speicherkapazität von etwa 100 Bytes. Es würde also nicht mal der erste Satz dieser Antwort in den Speicher passen.

Die ersten Computer wurden noch für jede Aufgabe fest verdrahtet. Später hatten die Computer eine einfache Maschinensprache, so dass man das Programm als Assemblercode mit Stift und Papier aufschreiben konnte und dann relativ einfach in Maschinensprache übersetzen konnte. Die Programme wurden dann oft "gefädelt". Also man hat sich sein Programm per Hand in Maschinensprache übersetzt und dann jede Menge sehr dünne Kabel genommen und sie für jede 1 durch einen Ferritring gefädelt und für jede 0 am Ferritring vorbei geführt. Der Computer konnte dann erkennen, welche Kabel wie gefädelt waren und brauchte nur wenige Byte Ram-Speicher, um das Programm ausführen zu können.

Soweit ich weiß, ist Fortran die erste Hochsprache, die damals auf den großen IBM Computern gelaufen ist. Der Compiler wurde vermutlich gefädelt, der Quellcode im Fortran-Code wurde mit Lochkarten eingelesen und das Ergebnis wieder direkt auf Lochkarten gestanzt.

Die Computer damals hatten aber auch die Möglichkeit, mit Schaltern direkt in den RAM zu schreiben und einzelne Takte per Hand auszuführen. Das wurde recht lange beibehalten und ging auch noch mit den ersten Heimcomputern (z.B. Altair 8800).

Dieses geschlossene System, wie wir es heute kennen, kam erst später. Also dass man einen Computer mit einem laufenden Programm braucht, um selbst ein Programm schreiben zu können.

...zur Antwort

Wie stelle ich mithilfe compareTo() die natürliche Objektreihenfolge her (Java)?

Ich habe heute über die compareTo()-Methode des Comparable-Interfaces gelesen, man würde sie wie folgt verwenden:

"If your class objects have a natural order, implement the 

Comparable<T>

 interface and define this method."

Aber wie kann ich compareTo() implementieren, um die natürliche Reihenfolge der Objekte herzustellen?

Beispiel: Ich sollte Studenten nach ihrer Punktzahl sortieren, habe dann compareTo() wie folgt überschrieben:

@Override
public int compareTo(Student student) {
    if(this.points > student.points)
        return 1; //current student is better
    return 0;
}

Allerdings returnt das ja jetzt nur einen bestimmten Wert, mit dem man dann arbeiten könnte, wenn man anschließend die Studenten z.B. in eine Liste packen will, aber es stellt ja nicht bereits in der Methode selbst die Objektreihenfolge her. Ich verstehe auch gar nicht, wie das gehen soll, wenn ich z.B. will, dass die Klasse Student das Interface Comparable implementiert. Ich meine, wenn ich dann ein Objekt erzeuge, dann kann ich auf dieses und ein anderes diese Methode anwenden, aber ich bräuchte ein weiteres Hilfsmittel, um die Studenten zu ordnen, wie eben z.B. besagte Liste.

Ist es also irgendwie möglich, compareTo() so zu überschreiben, dass es automatisch Studenten oder allgemein Objekte in ihre natürliche Reihenfolge bringt oder brauche ich dafür immer noch weitere Hilfsmittel?

Oder habe ich compareTo() auf richtige Weise überschrieben?

LG Kath

PS:
In der Doku steht ebenfalls Folgendes über Comparable():

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.

...zur Frage

Noch ein paar zusätzliche Gedanken:

Studenten haben keine natürliche Ordnung. Wenn man dir z.B. 10 Studenten hinstellt und sagt "sortier die mal", dann ist nicht automatisch klar, nach welchem Kriterium sie sortiert werden (es könnte z.B. nach Name (erst Nachname, dann Vorname oder vielleicht auch andersrum), nach Alter, nach Punktzahl, nach Größe, nach Farbe des Pullovers etc. sein). Von daher ist es untypisch, eine Klasse "Student" das Interface Comparable<Student> implementieren zu lassen.

In der Java-Dokumentation steht auch, dass dringend empfohlen wird, dass die compareTo-Funktion konsistent zu der equals-Funktion ist. Also anders gesagt: Wenn die compareTo-Funktion zurückgibt, dass zwei Objekte gleich sind (Rückgabewert 0), dass dann auch die equals-Funktion zurückgeben sollte, dass zwei Objekte gleich sind. Das ist aber nicht der Fall, wenn du zwei Studenten mit der gleichen Punktzahl hast.

Normalerweise würdest du also der Sortierfunktion direkt ein Kriterium mitgeben, nach dem sortiert werden soll. Z.B absteigend nach Punktzahl:

studentenListe.sort(Comparator.comparing(Student::getPunktzahl).reversed());

Nur falls es jetzt für besondere Anlässe eine bestimmte Sortierung gibt (z.B. bei der Zeugnisaugabe am Ende des Studiums sollen alle zuerst absteigend nach Punktzahl, dann nach Nachname und dann nach Vorname sortiert sein), könntest du einen Comparator als öffentliche Konstante in deine Klasse aufnehmen:

public static final Comparator<Student> COMP_ZEUGNISAUSGABE = Comparator.comparing(Student::getPunktzahl).reversed().thenComparing(Student::getNachname).thenComparing(Student::getVorname);

Und noch ein Tipp:

Mal angenommen, Studenten hätten eine natürliche Sortierung nach Punktzahl, würde ich dir empfehlen, die vorhandene compare-Funktion für den jeweiligen Variablentyp zu nehmen. Dadurch vermeidest du Flüchtigkeitsfehler. Z.B. bei int-Werten:

@Override
public int compareTo(Student other) {
	return Integer.compare(this.punktzahl, other.punktzahl);
}
...zur Antwort

Bei Objekt-Arrays kopiert die Methode "copyOf" nicht die Werte, sondern die Referenzen auf die Objekte des Original-Arrays. Das ist bei Arrays, die scheinbar aus primitiven Typen bestehen (in deinem Fall das double[][]) eine Stolperfalle. Das ist nämlich nicht einfach ein mehrdimensionales Array aus doubles, sondern ein Array aus double-Arrays und die double-Arrays sind Objekte, die per Referenz gespeichert werden. Das heißt, aClone hat Referenzen auf die double-Arrays, die auch in a liegen. Mit dieser Zeile veränderst du also auch die Werte in den Unterarrays von a:

aClone[i][j] -= alpha * aClone[p][j];

Um das zu umgehen, darfst du nicht mit copyOf das ganze Array kopieren, sondern musst jedes Unterarray einzeln kopieren:

double aClone[][] = Arrays.stream(a).map(subArray->Arrays.copyOf(subArray,subArray.length)).toArray(double[][]::new);
...zur Antwort

Die anderen Antworten hier fand ich bis jetzt noch nicht so aufschlussreich. Ich versuche es mal mit meinen Worten zu erklären:

In Java gibt es nicht wirklich mehrdimensionale Arrays. Zumindest nicht so, wie in anderen Programmiersprachen. In Java werden dafür Arrays aus Arrays benutzt, daher können die Unterarrays auch verschieden lang sein.

Du hast also die Variable "ausgabe", die ein Array aus int-Arrays ist und die Länge 3 hat (weil 3 Unterarrays enthalten sind). Die Unterarrays haben aber verschiedene Längen:

{ 
  {2, 3}, // Unterarray 0 mit Länge 2
  {7, 9, 1}, // Unterarray 1 mit Länge 3
  {4} // Unterarray 2 mit Länge 1
}

Um jetzt zu deiner eigentlichen Frage zurückzukommen, warum in der zweiten Schleife b < ausgabe[a].length steht: In der Variable a steht der Index, der grade behandelt wird (also welches Unterarray grade dran ist). Mit ausgabe[a].length wird also die Länge des aktuellen Unterarrays bestimmt. Wenn du das [a] weglassen würdest, also ausgabe.length würdest du stattdessen ermitteln, wieviele Elemente ausgabe hat. In diesem Fall also 3, weil drei Unterarrays in ausgabe stehen.

In einem anderen Kommentar hast du geschrieben "Wenn alle Unterarrays gleich lang sind, würde ja auch (b<ausgabe.length) reichen". Das stimmt so nicht. Wenn beispielsweise jedes Unterarray drei Zahlen hätte, aber insgesamt 10 Unterarrays in ausgabe stehen würden, würdest du eine ArrayIndexOutOfBoundsException kriegen, weil das Programm dann versuchen würde, in jedem Unterarray bis Index 9 zu zählen. Du müsstest also trotzdem ausgabe[a].length oder zumindest ausgabe[0].length benutzen.

...zur Antwort

Wenn du im Browser nochmal auf die Adresszeile klickst, siehst du, dass aus dem http ein https geworden ist. Die meisten Webseiten werden automatisch von http auf https weitergeroutet, ohne dass man das als Benutzer mitkriegt.

Http ist auch nicht per se unsicher. Wenn das eine Webseite ist, auf der du keine persönlichen Daten eingibst, sondern nur liest, kann das auch problemlos eine http-Seite sein. Es geht nur darum, dass die Verbindung halt nicht verschlüsselt ist und jemand mitlesen könnte, was du auf der Seite eingibst.

...zur Antwort

Das Tabellenblatt bezieht die Daten aus dem Blatt "Calculations", was so um die 100 Formeln hat, die sich wiederum auf die ganzen ausgeblendeten Tabellenblätter mit jeweils mehreren 1000 Datensätzen bezieht, daher kann ich da nicht alles durchgucken und schauen, ob ich irgendwelche Bezüge vergessen hab.

Das höchste, was ich finden konnte, war "Hand Ballista" mit Upgrade Level 25

...zur Antwort

Der Sinn von Klassen ist es, dass du damit Objekte erzeugen kannst und auf die Objekte kannst du dann mithilfe von self zugreifen.

Also um dein Beispiel zu vervollständigen müsstest du ein Objekt vom Typ CIRT anlegen und kannst dann davon die Methode Ram() aufrufen:

if __name__ == '__main__':
    cirt_object = CIRT()
    print(cirt_object.Ram())

Wenn deine Methode keinen Zugriff auf die Parameter eines bestimmten Objektes braucht, kannst du sie auch als Klassenmethode oder als statische Methode anlegen:

class CIRT:
    @staticmethod
    def Ram():
        return 'test'

if __name__ == '__main__':
    print(CIRT.Ram())
...zur Antwort