Frage zu Lambda Ausdrücken

sserio

Bekanntes Mitglied
Ich habe jetzt meinen Code fertig geschrieben ( die die beim gestrigen Post da waren wissen was ich meine ( zweidimensionales array)). Und ich habe mir gedacht, dass ich ja mal ausprobieren könnte die Lambda ausdrücke zu benutzen, jedoch klappt das bei mir nicht so wirklich
[CODE lang="java" title="Programm"]package ProjectEuler11;

import javax.swing.*;
import java.math.BigInteger;
import java.util.BitSet;

public class Main {
public static void main(String... args) {
System.out.println(findBiggestDiagonalSum(array()));
}

public static long findBiggestDiagonalSum(int[][] array) { //the code isn't universal because it has to be [20][20] in this example
long value = 0;
// 4 to right
for (var row = 0; row < array.length; row++) {
for (var column = 0; column < array[row].length - 3; column++) {
long temp = array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];
if (value < temp) {
value = temp;
}
}
}
// 4 to the bottom
for (var row = 0; row < array().length - 3; row++) {
for (var column = 0; column < array[row].length; column++) {
long temp = array[row][column] * array[row + 1][column] * array[row + 2][column] * array[row + 3][column];
if (value < temp) {
value = temp;
}
}
}
// 4 diagonal right
for (var row = 0; row < array().length - 3; row++) {
for (var column = 0; column < array[row].length - 3; column++) {
long temp = array[row][column] * array[row + 1][column + 1] * array[row + 2][column + 2] * array[row + 3][column + 3];
if (value < temp) {
value = temp;
}
}
}
// 4 diagonal left
for (var row = 0; row < array().length - 3; row++) {
for (var column = array.length - 1; column < array[row].length - 3; column--) {
long temp = array[row][column] * array[row + 1][column - 1] * array[row + 2][column - 2] * array[row + 3][column - 3];
if (value < temp) {
value = temp;
}
}
}
return value;
}

public static int[][] array() {
var value = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
int[][] arr = new int[20][20];
var splitValue = value.split(" ");
var index = 0;
for (int row = 0; row < arr.length; row++) {
for (int column = 0; column < arr[row].length; column++) {
arr[row][column] = Integer.parseInt(splitValue[index++]);
}
}
return arr;
}

public static void printArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.printf("%02d ", array[j]);

}
System.out.println();
}

}

}
[/CODE]

Ich habe versucht zum Beispiel beim value diesen mit einem Lambda ausdruck zu initialisieren :
[CODE lang="java" title="Lambda Ausdruck"] value -> value < array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];
// kleiner als diese vier stellen im 2 dimensionalen Array[/CODE]
Hat wer eine Idee wieso das nicht funktionieren könnte
 
Ich habe jetzt meinen Code fertig geschrieben ( die die beim gestrigen Post da waren wissen was ich meine ( zweidimensionales array)). Und ich habe mir gedacht, dass ich ja mal ausprobieren könnte die Lambda ausdrücke zu benutzen, jedoch klappt das bei mir nicht so wirklich
[CODE lang="java" title="Programm"]package ProjectEuler11;

import javax.swing.*;
import java.math.BigInteger;
import java.util.BitSet;

public class Main {
public static void main(String... args) {
System.out.println(findBiggestDiagonalSum(array()));
}

public static long findBiggestDiagonalSum(int[][] array) { //the code isn't universal because it has to be [20][20] in this example
long value = 0;
// 4 to right
for (var row = 0; row < array.length; row++) {
for (var column = 0; column < array[row].length - 3; column++) {
long temp = array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];
if (value < temp) {
value = temp;
}
}
}
// 4 to the bottom
for (var row = 0; row < array().length - 3; row++) {
for (var column = 0; column < array[row].length; column++) {
long temp = array[row][column] * array[row + 1][column] * array[row + 2][column] * array[row + 3][column];
if (value < temp) {
value = temp;
}
}
}
// 4 diagonal right
for (var row = 0; row < array().length - 3; row++) {
for (var column = 0; column < array[row].length - 3; column++) {
long temp = array[row][column] * array[row + 1][column + 1] * array[row + 2][column + 2] * array[row + 3][column + 3];
if (value < temp) {
value = temp;
}
}
}
// 4 diagonal left
for (var row = 0; row < array().length - 3; row++) {
for (var column = array.length - 1; column < array[row].length - 3; column--) {
long temp = array[row][column] * array[row + 1][column - 1] * array[row + 2][column - 2] * array[row + 3][column - 3];
if (value < temp) {
value = temp;
}
}
}
return value;
}

public static int[][] array() {
var value = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
int[][] arr = new int[20][20];
var splitValue = value.split(" ");
var index = 0;
for (int row = 0; row < arr.length; row++) {
for (int column = 0; column < arr[row].length; column++) {
arr[row][column] = Integer.parseInt(splitValue[index++]);
}
}
return arr;
}

public static void printArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.printf("%02d ", array[j]);

}
System.out.println();
}

}

}
[/CODE]

Ich habe versucht zum Beispiel beim value diesen mit einem Lambda ausdruck zu initialisieren :
[CODE lang="java" title="Lambda Ausdruck"] value -> value < array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];
// kleiner als diese vier stellen im 2 dimensionalen Array[/CODE]
Hat wer eine Idee wieso das nicht funktionieren könnte

Also Zeile 17-20 mit einem Lambda ausdruck zu ersetzen
 
Dein Lambda-Ausdruck ist im Prinzip gerade äquilavent zu dieser Funktion/Methode:
Java:
static boolean deineLambda(long value) {
  return value <  array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];
}
Er "mapped" also einen Parameter namens "value" (gleichnamig zu deiner lokalen Variablen) auf einen Boolean, der sich ergibt als Ergebnis des Vergleichsausdrucks: value < array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3]
 
value -> value < array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];

das hat mit lamdas auch nichts viel zu tun macht hier auch keinen sinn.


Lamdas machen sinn wenn eine Methode eine Methode aus einer anderen Klasse aufruft, und dafür dann keine anonyme Klasse erstellt werden muss.
 
value -> value < array[row][column] * array[row][column + 1] * array[row][column + 2] * array[row][column + 3];

das hat mit lamdas auch nichts viel zu tun macht hier auch keinen sinn.


Lamdas machen sinn wenn eine Methode eine Methode aus einer anderen Klasse aufruft, und dafür dann keine anonyme Klasse erstellt werden muss.
Also erstmal garnicht erst benutzen
 

Zurück
Oben