Matrix, Nachbarelemente

Al3xand3r01

Mitglied
Hallo zusammen, ich habe als Aufgabe bekommen eine Funktion zu schreiben, die ein zweidimensionales Array und zwei Kooardinaten übergeben bekommt und die Nachbarn des Elements retouniert. Natürlich könnte man das mit Schleifen lösen, aber ich finde irgendwie die Methode mit den Abfragen "besser" bzw eher dem Gefragten entsprechend. Leider bekomme ich aber immer falsche Werte raus, ich bin mir sicher, dass ich irgenwo eine Kleinigkeit übersehen habe (oder auch was Grundlegendes nicht bedacht habe :D), hoffentlich kann mir jemand weiterhelfen. Btw: ich lerne Java noch nicht lange (bin 15), also seid bitte gnädig :D

Lg und danke im Voraus!

Hier mein Code:

Java:
public class neighbours {
    public static void main(String[] args) {
        //Aufruf
        int[][] arr2d = {{1,2,3},{4,5,6},{7,8,9}};
        System.out.println(nachbarn(arr2d, 0, 0));
    }
    static int nachbarn(int[][] arr, int x, int y){
        int result = 0;
        if (x <= 0){
            result += arr[y][x] + arr[y][x+1];

        }
        else if (x >= arr[y].length-1) {
            result += arr[y][x] + arr[y][x-1];
        }

        else {
            result += arr[y][x] + arr[y][x-1] + arr[y][x+1];
        }


        if (y <= 0) {
            result += arr[y][x] + arr[y+1][x];
        }
        else if (y >= arr.length-1){
            result += arr[y][x] + arr[y-1][x];
        }
        else {
            result += arr[y][x] + arr[y + 1][x] + arr[y + 1][x];
        }
        return result;
    }

EDIT: ups, zweimal gepostet - sorry
 

Al3xand3r01

Mitglied
Danke für Deine Antwort! Könntest du mir bitte schreiben was genau Du meinst (bzw. nur welche Zeile)? Das Interessante ist, dass die Ergebnisse manchmal zu niedrig, manchmal zu hoch ausfallen.
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Ich soll die Summe der Nachbarelemente zurückgeben.
Ok, was sind denn Nachbarelemente? Du verwendest oben ja nur N O W S. In den meisten derartigen Aufgaben, welche ich kenne, werden allerdings auch NO, SO, SW und NW als Nachbarelemente angenommen. Könnte das eventuell noch zu deinen falschen Ergebnissen führen?

Bist du dir außerdem sicher, dass y der erste Index und x der zweite Index ist? Ich würde meinen es sollte umgekehrt sein
 

Al3xand3r01

Mitglied
Ja es sollte auch No, So, Sw und Nw genommen werden - das wollte ich mit dem x+1 und y +1 und y -1 und x-1 erreichen - hab ich da einen Denkfehler?
X und Y hab ich auch noch vertauscht...
Aber irgendwie sind die Ergebnisse komplett suspekt, einmal niedriger einmal höher.
Meinst Du sollte ich das ganze vielleicht nicht nur mit Abfragen machen sondern mit Schleifen? Wir werden dazu angehalten perfomant zu programmieren, kostet mich das viel Performance?
 
K

kneitzel

Gast
Also vermutlich will er die diagonalen Elemente auch sonst wäre das Ergebnis nicht mal zu klein und mal zu groß... will er das Ursprungselement denn auch?

Zähl die Felder doch bitte mal auf für den Fall, dass es kein Randelement ist. Du hast ja ein Beispiel angegeben mit dem 3x3 Feld gefüllt mit den Zahlen von 1-9 ....
Was soll berechnet werden, wenn das Element ganz in der Mitte angegeben wird?

Und genereller Lösungsansatz:
Formuliere es erst mal als Summe aller Felder als wenn es alle Felder geben würde.
Den Feldzugriff machst Du aber dann als Methode z.B. getValueOrNull(int[][] Matrix, ist x, int y) was dann x/x auf Gültigkeit prüft und dann entweder den arrayinhalt der Position oder 0 zurück gibt.
 

Al3xand3r01

Mitglied
Also wenn das Elemtent in der Mitte liegt, dann würden alles restlichen Elemnte zusammengerechnet (in dem 3x3 Beispiel). Das Ursprungselement soll nicht gezählt werden.

Dein Lösungansatz gefällt mir gut, den werde ich auch umsetzen! Damit ich es richtig verstehe: Eine Methode die den Inhalt der Felder abruft, wenn das Element nicht existiert wird 0 zurcükgegeben. Diese Methode rufe ich dann in einer Schleife auf. Stimmt das so?

Danke für die Anregung!
 

M.L.

Top Contributor
Auf die Schnelle: da nur die Nachbarelemente aufaddiert werden sollen, kann man die Feldanweisung [y][x] ignorieren, bzw. auskommentieren. Und in der letzten Bedingung sollte es an einer Stelle wohl "y-1" heissen.
Mit einer Teständerung könnte es passen:
Java:
public static void main(String[] args) {
        //Aufruf
        int[][] arr2d = {{1,2,3},{4,5,6},{7,-8,9}};  // -8
        System.out.println(nachbarn(arr2d, 2, 2));  // 2,2   statt 0,0
    }
    static int nachbarn(int[][] arr, int x, int y){
        int result = 0;
        if (x <= 0){
            //result += arr[y][x] + arr[y][x+1];
            result +=  arr[y][x+1];
            //  result +=   arr[x][y+1];
        }
        else if (x >= arr[y].length-1) {
            result += /*arr[y][x] + */ arr[y][x-1];
        }

        else {
            result += /*arr[y][x] + */ arr[y][x-1] + arr[y][x+1];
        }


        if (y <= 0) {
            result +=   arr[y+1][x];
            //result += arr[y][x] + arr[y+1][x];
            //result +=   arr[x+1][y];
        }
        else if (y >= arr.length-1){
            result += /*arr[y][x] + */ arr[y-1][x];
        }
        else {
            result += /*arr[y][x] +*/ arr[y - 1][x] + arr[y + 1][x];
        }
        return result;
}
 
K

kneitzel

Gast
Bei sowas würde ich Dir empfehlen, dir das aufzuzeichnen.

Also mal Dir deine Matrix auf mit drei mal drei Feldern:

x-1, y-1 | x, y-1 | x+1, y-1
x-1, y | x,y | x+1, y
x-1, y+1 | x, y+1 | x+1,y+1

Und dann geh den Code von Hand durch. Dann erkennst Du dass du in jedem if / else if / else Konstrukt das Feld x,y addierst (Das hast Du also doppelt - willst Du es überhaupt haben?)

Und in jedem Konstrukt addierst Du nur 3 Zahlen, also hast Du maximal 6 Felder von den 9 Feldern. Aber da eins doppelt ist, hast Du nur 5 Felder berücksichtigt.

Die Frage nach Schleife oder nicht spielt aus Performance Gründen keine Rolle. So minimal, dass es keine Rolle spielt.
Das ist nur eine Frage des Lesbarkeit. Du kannst also drei Array Elemente addieren (Beispiel mit einem int Array mit Namen a - Beispiel unabhängig von Deinem Problem!):
Java:
int result = a[0] + a[1] + a[2];
Oder Du kannst eine Schleife machen die halt von 0 bis 2 durchzählt.

Bei Dir wären es zwei verschachtelte Schleifen und da Du das mittlere Element nicht willst noch eine if Abfrage.

Das geht prinzipiell auch. Das sind zwei Ansätze, die ich sehe:
a) Du hast diese "Hilfsmethode", die prüft, ob ein Feld existiert. Dann brauchst Du keine Schleife um 8 Elemente zu addieren. Die Addition finde ich besser leslich.
b) Du baust es mit Schleifen. Da können Anfang und Ende dynamisch sein. Du hast dann vor den Schleifen die Festlegung der Grenzen um dann die Schleifen durchlaufen zu lassen. Das wäre dann sogar ganz ohne diese Hilfsmethode.


Hilfsmethode klingt schlecht, aber es ist etwas positives. So würde ich die Grenzen auch über Methoden ermitteln. Und wenn man sich das anschaut, dann sind es einfache min / max Entscheidungen. Die untere Grenze ist das Maximum von x-1 und 0 bzw y-1 und 0 und die obere Grenze ist das Minimum von eben x+1 (oder y+1) und der Array-Größe.

Aber das wären die generellen Abläufe, die ich sehen würde.
 

Al3xand3r01

Mitglied
@M.L. danke für Deine Antwort! Ich habe den Code gerade getestet, aber er liefert leider auch keine passenden Ergebnisse :/ aber ich glaube, dass ich mit diesem Ansatz sowieso auf dem Holzweg bin, danke trotzdem!

@kneitzel hab ich gerade gemacht, jetzt ist mir der Fehler klar.
Ich werde aufjedenfall die Hilfmethode nehmen, das finde ich auch schöner und ich denke, dass es den Lehrern so auch besser gefällt ;)
Vorallem die Trennung zwischen Überprüfung und tatsächlicher Addition gefällt mir.

Mich fasziniert immer wieder wie viele Potentielle Lösungen es gibt...

Danke an alle die mir geholfen haben, ich denke, dass ich es jetzt fertig bekomme.

Schönen Tag und Gruß aus Österreich!
 

M.L.

Top Contributor
Ein potentieller Angriff auf das Programm führt dann zu Informationen, die einem unter regulären Umständen nicht zustehen, ein Hacken erleichtern (oder ermöglichen) und zum eigenen Vorteil ausgenutzt werden können. Man stelle sich das mit sensiblen Daten zur Gesundheit oder Kontodaten vor... Kurzgefasst sollte nur die Programmiererseite die Ergebnisse der Exceptions zu sehen bekommen (und geeignet handeln)
 

Al3xand3r01

Mitglied
Ah ok, das macht Sinn. Dann werde ich mir das gar nicht falsch angewöhnen und es direkt "richtig" machen :)
Ist jetzt zwar offtopic, aber mich interessiert wie Angriffe ablaufen, wie man sich davor schützen kann, bzw wie man den Code härtet, kennt ihr ein gutes Buch dazu? Ist jetzt zwar noch früh, aber ich würde gerne von Anfang an "sicheren" Code schreiben oder besser gesagt wenigstens verstehen worum es geht und worauf man achten muss.
 
K

kneitzel

Gast
Ein potentieller Angriff auf das Programm führt dann zu Informationen, die einem unter regulären Umständen nicht zustehen, ein Hacken erleichtern (oder ermöglichen) und zum eigenen Vorteil ausgenutzt werden können. Man stelle sich das mit sensiblen Daten zur Gesundheit oder Kontodaten vor... Kurzgefasst sollte nur die Programmiererseite die Ergebnisse der Exceptions zu sehen bekommen (und geeignet handeln)
Also da die Exception ja gefangen würde, ist das kein Argument. Die Exception bleibt somit ja auf der Programmiererseite....

Aber eine Exception zu werfen ist relativ umfangreich, denn es muss ein Stacktrace erstellt werden und so. Daher wäre das Laufzeitverhalten noch ein Grund.

Beim Debuggen kann es problematisch sein, wenn ständig Exceptions fliegen, denn dann kann man nicht einfach bis zur Exception laufen lassen. Das wäre ggf. noch ein praktischer Grund.

Generell hat es sich aber auch aus Clean Code Sicht eingebürgert, dass Exceptions nur für exceptional Behaviour verwendet werden. Also ein "Ich bin zu blöd, es richtig zu machen" soll vermieden werden...

Wenn Du ein Array aufsummieren willst, kannst Du auch mit Exceptions arbeiten. Einfach bei Element 0 anfangen und dann immer weiter machen, biss eine IndexOutOfBoundsException fliegt. Aber das würde man ja auch nicht als gut empfinden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I matrix aufgabe Java Basics - Anfänger-Themen 22
L Zweidimensionaler Array; n x m - Matrix überprüfuen Java Basics - Anfänger-Themen 35
C Matrix mit Array ausgeben Java Basics - Anfänger-Themen 6
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
F Adjunkte Matrix erstellen Java Basics - Anfänger-Themen 3
M Matrix Java Basics - Anfänger-Themen 3
F Matrix Multiplikation Java Basics - Anfänger-Themen 3
B Dünn besetzte Matrix Java Basics - Anfänger-Themen 7
E Rückwärtsmultiplikation einer invertierten matrix Java Basics - Anfänger-Themen 2
U Dreiecks-Matrix mit Array Java Basics - Anfänger-Themen 3
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
M Matrix auf 4 Elemente untersuchen mit offenen Enden Java Basics - Anfänger-Themen 8
B Diskrete Faltung (Matrix) Randfälle Java Basics - Anfänger-Themen 8
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
N Quadratische Matrix inkl Summe Java Basics - Anfänger-Themen 8
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
D Methoden Matrix Multiplikation Java Basics - Anfänger-Themen 27
O Matrix, Vektor Java Basics - Anfänger-Themen 9
H 2D Array, Symmetrische Matrix Java Basics - Anfänger-Themen 12
S Matrix spaltenweise befüllen Java Basics - Anfänger-Themen 1
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
C Matrix erstellen Spaltensumme, Zeilensumme, Diagonale Java Basics - Anfänger-Themen 1
S Methoden Transponierte Matrix Java Basics - Anfänger-Themen 3
N Vererbung Submatrix mit Verweis auf Matrix erstellen Java Basics - Anfänger-Themen 9
J Matrix erstellen Java Java Basics - Anfänger-Themen 7
B Transponiertes Matrix Java Basics - Anfänger-Themen 12
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
C Matrix transponieren - Hilfe Java Basics - Anfänger-Themen 1
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
L Matrix(Array) minimieren... Java Basics - Anfänger-Themen 9
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
S eingegebene Matrix anzeigen Java Basics - Anfänger-Themen 4
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
G Bilddaten in Matrix umwandeln Java Basics - Anfänger-Themen 1
T Eine String Matrix erstellen die eine boolean Funtion verwendet Java Basics - Anfänger-Themen 10
O Matrix Multiplizieren Java Basics - Anfänger-Themen 4
S LWJGL - Matrix vom Matrixstack laden Java Basics - Anfänger-Themen 3
T Matrix auf Symmetrie überprüfen Java Basics - Anfänger-Themen 6
V Matrix Transponieren Java Basics - Anfänger-Themen 3
V Methoden Matrix als 1D Array mit Werten füllen Java Basics - Anfänger-Themen 12
W Zweidimensionale Arrays als Matrix ausgeben Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
O Matrix ordnen Java Basics - Anfänger-Themen 4
M Symmetrische Matrix Java Basics - Anfänger-Themen 2
W Methoden Rang von einer Matrix mit Gauss Java Basics - Anfänger-Themen 0
U Matrix Subtrahieren Java Basics - Anfänger-Themen 12
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
A daten vom 1d array in 2d matrix speichern Java Basics - Anfänger-Themen 3
I Matrix überprüfen Java Basics - Anfänger-Themen 8
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
K Methoden Einlesen einer unbegrenzten Matrix über Konsole Java Basics - Anfänger-Themen 6
O Einlesen einer Matrix von der Console Java Basics - Anfänger-Themen 18
N Matrix/Vektoren Java Basics - Anfänger-Themen 3
N Matrix Java Basics - Anfänger-Themen 14
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
J Matrix Java Java Basics - Anfänger-Themen 3
D 2 mehrdimensionale Matrix einlesen Java Basics - Anfänger-Themen 2
A N*N Matrix Determinante berechnen Java Basics - Anfänger-Themen 47
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
B Zeilenumbruch (zweidim. Matrix) Java Basics - Anfänger-Themen 2
O Java Matrix mal Matrix über while Schleife... Java Basics - Anfänger-Themen 10
O Transponieren einer Matrix per While-Schleife Java Basics - Anfänger-Themen 3
M Matrix - Probelm Java Basics - Anfänger-Themen 7
O 2D Matrix befüllen mit geraden Zahlen!? Java Basics - Anfänger-Themen 14
J Java Matrix befüllen Java Basics - Anfänger-Themen 5
M Matrix Matrix Multiplikation Java Basics - Anfänger-Themen 6
F Matrix Java Basics - Anfänger-Themen 11
E Array als Matrix Java Basics - Anfänger-Themen 21
G OOP Parameter Matrix Java Basics - Anfänger-Themen 2
N Matrix Klasse Java Basics - Anfänger-Themen 4
B Maske an eine Matrix anpassen Java Basics - Anfänger-Themen 5
W Matrix übergeben Java Basics - Anfänger-Themen 7
T Matrix transponieren Java Basics - Anfänger-Themen 17
W Eine Methode schreiben, ob eine Matrix eine Diagonalmatrix ist.? Java Basics - Anfänger-Themen 3
M String Datei in Float-Matrix umwandeln Java Basics - Anfänger-Themen 8
D Problem: Werte eine Matrix vergleichen! Java Basics - Anfänger-Themen 5
B Matrix Java Basics - Anfänger-Themen 2
Semox Matrix multiplizieren Java Basics - Anfänger-Themen 4
N Matrix an toString Java Basics - Anfänger-Themen 7
C Diagonale in einem NxN Matrix Java Basics - Anfänger-Themen 6
F Einträgen von Matrix zu sotieren Java Basics - Anfänger-Themen 2
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
J Spezielle Matrix ausgeben ! Java Basics - Anfänger-Themen 8
S Problem bei Matrix Addition Java Basics - Anfänger-Themen 5
F matrix werte übergeben Java Basics - Anfänger-Themen 5
M Hauptdiagonale Matrix berechnen Java Basics - Anfänger-Themen 6
M Klassenerstellung für Matrix mit Rechenopperationen Java Basics - Anfänger-Themen 42
D Matrix .bat datei erstellen und öffnen Java Basics - Anfänger-Themen 2
J Matrix ausgeben Java Basics - Anfänger-Themen 9
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
N prüfe ob etwas in einer Matrix steht... Java Basics - Anfänger-Themen 14
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27
J Matrix aus Datei einlesen mit StreamTokenizer Java Basics - Anfänger-Themen 3
K Transponiere Matrix Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben