public static int getMaximum(int[]arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
Tatsächlich hätte ich dies nach einigen paar Minuten überlegen als Lösung vorgeschlagen.Dein Code ist ja fast richtig, es geht nur um die Initialisierung von max. Da nimmst Du einfach mal 0 an. Stattdessen könntest Du auch einfach das erste Element verwenden. In der Schleife brauchst Du das erste Element natürlich nicht nochmals zu überprüfen und beginnst daher nicht mehr bei 0 sondern bei 1:
Java:public static int getMaximum(int[]arr) { int max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }
Soweit klar?
int max = array[0].length; // bin mir hier jedoch sicher, dass das falsch ist
for (int i = 0; i < array.length; i++) {
for (int j = 0;j < array[i].length; j++) {
if (array[i].length > max) {
max = array[i][j];
}
}
}
Naja entweder wir nutzen eine while-Schleife, oder zählen quasi wieder durch eine for-Schleife.Langsam... Du hast jetzt eine MethodegetMaximum(int[] arr)
, die das Maximum eines eindimensionalen Arrays liefert. Kannst Du die Methode vielleicht in einer Schleife verwenden, um für jedes Array (eines 2D-Arrays) das Maximum zu ermitteln?
Vermute, dass meine Initialisierung falsch ist, wüsste aber keine andere.Ja, Code will ich sehen![]()
public static int getMaximum(int[][]arr) {
int max = arr.length;
for (int x = 0; x < arr.length; x++) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i].length > max) {
max = arr[i][j];
}
}
}
}
return max;
}
public void zeigeMaxima(int[][] array) {
for (int i = 0; i < array.length; i++) {
int[] arr = array[i]; // das i-te Array aus array
int max = getMaximum(arr);
System.out.println(max);
}
}
Ist in dem Fall verständlich.Wir schreiben aneinander vorbei, es geht darum, die oben, für den eindimensionalen Fall entwickelte Methode getMaximum zu verwenden:
Soweit verständlich?Java:public void zeigeMaxima(int[][] array) { for (int i = 0; i < array.length; i++) { int[] arr = array[i]; // das i-te Array aus array int max = getMaximum(arr); System.out.println(max); } }
for (int x = 0; x < array.length; x++) {
int[]arr = array[x];
int max = arr[0];
for (int i = 0; i < array.length; i++) {
for (int j = 0;j < array[i].length; j++) {
if (array[i].length > max) {
max = array[i][j];
System.out.println(max);
}
}
}
}
for (int x = 0; x < array.length; x++) {
int[]arr = array[x];
// code der Methode getMaximum()
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// Ende der Methode getMaximum()
System.out.println(max);
}
int[] arr = array[x]
entfernen willst, dann musst Du arr
überall noch durch array[x]
ersetzen: for (int x = 0; x < array.length; x++) {
// code der Methode getMaximum()
int max = array[x][0];
for (int i = 1; i < array[x].length; i++) {
if (array[x][i] > max) {
max = array[x][i];
}
}
// Ende der Methode getMaximum()
System.out.println(max);
}
...die Werte eines zweidimensionalen Arrays in ein eindimensionales kopieren.
Zudem soll der größte Wert jedes einzelnen Arrays weggelassen werden.
Wichtig ist auch das die Arrays unterschiedliche Größen haben können.
Naja, es ging ja erstmal darum, ein paar Grundlagen zu erarbeiten: wie findet man ein Maximum, wie lässt sich im Prinzip ein 2D-Array in ein 1D-Array kopieren.
Jetzt heißt es, erstmal zurück auf Anfang. Beschreib doch mal in Worten, was Du machen müsstest, um die Aufgabe zu lösen, Du kannst jetzt dabei voraussetzen, dass Du in einem Array das Maximum ermitteln kannst.
Das ist schon mal der grobe Plan, wenn Du das aber genauer formulierst, wirst Du auf Probleme stoßen:Also würde ich vermuten, dass wir erst die max Werte der einzelnen Arrays ermitteln, daraufhin diese eliminieren, oder neue arrays ohne diese werte schaffen, diese dann in ein 1d array kopieren, dann absteigend sortieren, dabei beachten, dass unterschiedliche größen möglich sind und am anfang einen test, ob eins der arrays = null oder leer ist -> return new int[] {}; vermutlich.
Falls arrays == null oder leer ist, leeres Array zurückgeben.
Für jedes Array a aus arrays wiederhole {
max := Maximum aus a ermitteln
b := Array a aber ohne max
und nu?
}
Das ist schon mal der grobe Plan, wenn Du das aber genauer formulierst, wirst Du auf Probleme stoßen:
Code:Falls arrays == null oder leer ist, leeres Array zurückgeben. Für jedes Array a aus arrays wiederhole { max := Maximum aus a ermitteln b := Array a aber ohne max und nu? }
Falls arrays == null oder leer ist, leeres Array zurückgeben.
Für jedes Array a aus arrays wiederhole {
max := Maximum aus a ermitteln
b := Array a aber ohne max
b absteigend sortieren
return b;
}
Ja da hast du recht, das war auch nicht so gemeint wie es da stehtEin return innerhalb einer Schleife gibt keinen Sinn, da dann schon bei der ersten Iteration b zurückgegeben wird.
Am Anfang, also sind die ersten x Indexstellen von x Arrays deren MaximaUnd noch was, nachdem Du die Sortierung ja schon ins Spiel gebracht hast: wenn Du b absteigend sortierst, wo steht dann das Maximum?![]()
Weiß gerade nicht worauf du hinaus möchtest, wenn wir folgendes haben, ist die Logik doch vollendet, oder sehe ich das falsch?Genau, was aber immer noch nicht die Frage klärt, was mit dem Array b anschließend geschehen soll.
Falls arrays == null oder leer ist, leeres Array zurückgeben.
Für jedes Array a aus arrays wiederhole {
max := Maximum aus a ermitteln
b := Array a aber ohne max
}
b absteigend sortieren {
}
return b;
b := Array arrays[0] aber ohne das Maximum
b := Array arrays[1] aber ohne das Maximum
b := Array arrays[2] aber ohne das Maximum
sortiere b absteigend
gib b zurück
import java.util.Arrays;
public class Functionality {
public static void main(String[] args) {
System.out.println(Arrays.toString(flatternAndSortWithoutBiggest(new int[][] {{1,2,3},{4,5,6},{7,8,9}})));
}
public static int[] flatternAndSortWithoutBiggest(int[][] array) {
if (array == null || array.length == 0)
throw new IllegalArgumentException ("Array null oder leer!");
int[] eindim = new int[9];
int[][] zweidim = {
new int[] {1,2,3},
new int[] {4,5,6},
new int[] {7,8,9} };
int counter = 0;
for (int i = 0; i < zweidim.length; i++) {
for (int j = 0; j < zweidim[i].length; j++) {
eindim[counter] = zweidim[i][j];
counter++;
}
}
return eindim;
}
}
1. Falls array == null gilt oder array leer ist, gib ein leeres Array zurück
2. Entferne das Maximum in jedem Array aus array
3. Überführe das 2D-Array array in ein 1D-Array arr
4. Sortiere arr absteigend
5. Gib arr zurück
public static int[] flatternAndSortWithoutBiggest(int[][] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException ("Array null oder leer!");
}
removeEachMaximum(array);
arr = flattened(array);
sortDescending(arr); // alternativ: arr = sortDescending(arr)
return arr;
}
i := 0
So lange i < array.length, wiederhole {
array[i] := array[i] ohne dessen Maximum
i++
}
public static void removeEachMaximum(int[][] array) {
for (int i = 0; i < array.length; i++) {
array[i] = arrayOhneMaximum(array[i]);
}
}
// liefert ein Array, das alle Element aus arr mit Ausnahme des Maximums enthaelt.
public int[] arrayOhneMaximum(int[] arr) {
int[] ergebnis = new int[arr.length-1];
// fuelle ergebnis
return ergebnis;
}
Index | Input | Output |
0 | 5223 | |
1 | 2890 | |
2 | 2194 | |
3 | 5292 | |
4 | 2149 | ------- |
Das ist viel zu ungenau. Lass mal den Code weg: was würdest Du bei der Tabelle aus #86 als allererstes machen?Naja, ich ziehe alle Werte < max rüber. (Algorithmisch)
Index 0 -> rüberDas ist viel zu ungenau. Lass mal den Code weg: was würdest Du bei der Tabelle aus #86 als allererstes machen?
So, und das Maximum fliegt Dir auf telepathischem Wege zu?Das Einzige was bei genauer Betrachtung geschieht ist dass man Zahl für Zahl darauf Prüft ob sie kleiner als das Maximum ist.
Zahl für Zahl darauf Prüft ob sie kleiner als das Maximum ist.
hast Du noch einen Gedankenfehler, denn Du musst ja angeben, in welche Zeile (=Index) der Tabelle der Wert eingetragen werden soll.soll sie ausgegeben werden der index spielt doch da keine Rolle.
int max1 = b[0][0];
int max2= b[1][0];
for (int k=1; k<b[0].length;k++) {
if (b[0][k] > max1) max1= b[0][k];
for (int i=1; i<b[1].length;i++) {
if (b[1][k] >max2) max2=b[1][k];
}
}
int count = 0;
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++) {
a[count] = b[i][j];
count++;
if (a[count] == max1)
a[count]= a[count]-max1;
}
Meinst du quasi mit einer Sortier Methode ? Also sprich das ich beide Arrays mit einer Methode wie bubble oder insertion sortieren lasse?Also mehrerer Ideen:
A) Man könnte Elemente verschieben. Du könntest das Maximum also z.B. am Anfang oder am Ende halten. Dann hast du einen geschlossenen Bereich, den du später behandeln kannst.
B) Du kannst Dir die Stelle merken (statt dem Wert). Dann kannst du bei der Behandlung eines Arrays immer prüfen, ob die Stelle das Maximum ist oder nicht um dann das Maximum ggf. zu ignorieren.