maximum in integer array suchen

Status
Nicht offen für weitere Antworten.

robochris

Aktives Mitglied
Hallo,

kann es sein, dass es in Java keine fertige Funktion zur Suche eines Maximum in einem Integer-Array gibt?

Gruß,
chris
 

robochris

Aktives Mitglied
Ich meine den größten Wert in einem Integer Array ( nicht den Betrag ). Der größte Betrag von {-10,2,3,5} wäre 10. Ich will die 5.
 

andre111

Bekanntes Mitglied
ich würds so machen:


Code:
public static int max( int[] array ) {
    
    int i = array[0];

    for( int j = 1; j < array.length; j++ ) {
        if( array[j] > i )
            i = array[j];
    }
    return i;
}

Allerdings löst das eine ArrayIndexOutOfBoundsException aus wenn man ein Array ohne Inhalt übergibt.
Kann man so vermeiden:

Code:
public static int max( int[] array ) {
    
    if( array.length <= 0 )
        return 0;

    int i = array[0];

    for( int j = 1; j < array.length; j++ ) {
        if( array[j] > i )
            i = array[j];
    }
    return i;
}
 

robochris

Aktives Mitglied
Aus C bin ich schöne Unterfunktionen wie z.B. y=max(a);
gewöhnt, ohne dass man mehrere Zeilen programmieren muss.

Naja, egal. Ich habe mir die for-Schleife in Java gerade eben mal genauer angesehen.

Mit scheint folgender Code eleganter ( hier mal mit double statt mit integer )
Code:
					double[] d=new double[1000];

...
					double max=0;
					for(double x:d)	if(x>max)max=x;

Hoffentlich funktioniert er auch "elegant"
 

andre111

Bekanntes Mitglied
Das lässt sich so beheben:

Code:
double[] d=new double[1000]; 

...

double max=d[0]; 
for(double x:d)   if(x>max)max=x;
 

robochris

Aktives Mitglied
Hallo andre111, Gute Idee.

Ich hab's so gemacht:

double max=0x080000000;

Ist aber zugegebenermaßen nicht sehr schoen
 
M

maki

Gast
Setze doch max auf die kleinstmögliche Zahl:
Code:
double max = Double.MIN_VALUE;
Schön weil aussagekräftig.
 
B

Beni

Gast
Double.MIN_VALUE ist grösser als 0... aber mit Double.NEGATIVE_INFINITY würde es gehen.
 

Janus

Bekanntes Mitglied
dann geb ich doch noch mal meinen senf dazu ab:
Code:
/**
 * Gets the maximum element of a given array of doubles.
 * @param arr Array of double, length > 0, not <tt>null</tt>.
 * @return The maximum element.
 */
double max( double[] arr )
{
  double max = arr[ 0 ];
  for( int i = 1; i < arr.length; ++i )
    if( arr[ i ] > max )
      max = arr[ i ];
  return max;
}
was ist an dieser lösung 'schön'? sie schmeisst unchecked exceptions und zwar in genau in den fällen, wenn die methode kein sinnvolles ergebnis liefern kann: der parameter ist null oder das array hat die länge 0. in diesen fällen handelt es sich eindeutig um einen programmierfehler, denn so ein 'array' hat kein maximum und es gibt keine möglichkeit noch irgendwas sinnvolles zurückzuliefern.

eine alternative wäre evtl. folgendes
Code:
/**
 * Gets the index of the maximum element of a given array of doubles or -1 if
 * no such element exists.
 * @param arr Array of double.
 * @return The maximum element's index or -1.
 */
int max( double[] arr )
{
  if( arr == null || arr.length == 0 )
    return -1;
  int max = 0;
  for( int i = 1; i < arr.length; ++i )
    if( arr[ i ] > arr[ max ] )
      max = i;
  return max;
}
 

andre111

Bekanntes Mitglied
da war meine lösung die ich ganz am anfang gebracht hab, nur mit double statt integer :bae:
und was ist wenn der maximalwert -1 ist, dann kann man nicht nachvollziehen ob das der echte maximalwert oder nur der fehler ist. Außerdem können keine elemente < 0 als maximalwert erkannt werden
 
S

SlaterB

Gast
> und was ist wenn der maximalwert -1 ist, dann kann man nicht nachvollziehen ob das der echte maximalwert oder nur der fehler ist

-1 ist der Index, nicht der Wert

---------

und was macht man dann mit dem Maximumindex?
wenn man
double max = arr[max(arr)];
aufruft hat man den gleichen Fehler, nur umständlicher

in beiden Fällen muss der Aufrufer aufpassen, dass das Array nicht leer ist, sonst macht's bumm

da finde ich die erste Variante sinnhafter, dann sieht man direkt,
worans liegt,
und muss nicht erst rätseln, woher dieser seltsame -1 Index kommt ;)

ich persönlich bevorzuge manchmal noch eine aussagekräftigere Exception

if( arr == null || arr.length == 0 ) {
throw new IllegalArgumentException/MyException("xy")
}
 

andre111

Bekanntes Mitglied
oder man machts so:

Code:
public static double max( double[] array ) {
    double max = array[0];
    for( double d : array ) {
        if( d > max) max = d;
    }
    return max;
}


und derjenige der die funktion verwendet muss halt zuerst selber überprüfen ob array.length nicht 0 ist

Code:
double array[] = {};
double max;

if( array.length != 0 )
    double max = max( array );
 

Janus

Bekanntes Mitglied
andre111 hat gesagt.:
und derjenige der die funktion verwendet muss halt zuerst selber überprüfen ob array.length nicht 0 ist

genau das ist der hintergrund, warum es 'schön' ist, die fehlerbehandlung auf grundlegende unchecked exceptions zu reduzieren. in diesem fall wäre auch die variante einer IAE, wie von SlaterB vorgeschlagen, gut.
es gibt unglaublich viel code, der an allen ecken und enden versucht, auf null zu prüfen oder ungültige parameter irgendwie abzufangen. das ist aber nur dann sinnvoll, wenn der aufrufer einer methode mit dem rückgabewert für ungültige parameter sinnvoll weiterarbeiten kann. kann er das nicht, so pflanzt sich im code ein fehler fort, der an irgendeiner ganz anderen stelle zu ausnahmen oder falschen ergebnissen führen kann. deshalb ist es immer eine überlegung wert, solche programmierfehler im keim zu ersticken, indem man eine unchecked exception schmeisst bzw. schmeissen lässt.
 
M

maki

Gast
Beni hat gesagt.:
Double.MIN_VALUE ist grösser als 0... aber mit Double.NEGATIVE_INFINITY würde es gehen.
Danke für die korrektur Beni.

Ansonsten bin ich auch der Meinung, dass eine Exception geworfen werden sollte, wenn das übergebene Arrays leer/null ist, aber anstatt der IndexOutOfBounds wäre eine IllegalArgument Ex. auch meine erste Wahl, so wie SlaterB vorgeschlagen hatte, weil aussagekräftiger.
 
S

SlaterB

Gast
@Janus:
achso, du bist meiner Meinung, dachte du wolltest es verurteilen, nicht auf null zu prüfen ;)
 

Janus

Bekanntes Mitglied
was ich verurteile sind überprüfungen auf null an allen ecken und enden. da kann ich mich nicht des eindrucks erwehren, dass der entwickler irgendwann den überblick darüber verloren hat, was methoden tatsächlich tun sollen und wie sie aufgerufen werden ;)
 

robochris

Aktives Mitglied
Erstaunlich, wie weit sich der Thread über die Maximums-Funktion hingezogen hat.

Ist es nicht ein wenig ärgerlich, dass eine so grundlegende Funktion wie die Bestimmung des Maximums so einen Aufwand erfordert?
Warum gibt es keine Standartklassenbibliothek, die aus verschiedensten Datentypenarrays das Maximum oder Minimum sucht?

Vor dem Benutzen der Funktion die Arraylaenge überprüfen zu müssen, ist ja auch irgendwie "Quark". Sowas macht den Code nur länger und schlecht lesbar. Also muss die Funktion diese Überprüfung selbst übernehmen.
 

Janus

Bekanntes Mitglied
weil sun arrays uncool findet ;)

http://java.sun.com/javase/6/docs/api/java/util/Collections.html#max(java.util.Collection)
 

andre111

Bekanntes Mitglied
Wenn man die länge des arrays in der funktion überprüfen lässt besteht weiterhin die frage welchen sinnvollen wert man zurückgebekommt wenn die länge null ist.
Auch wenn man eine Exception wirft muss der, der die Funktion verwendet auf die Exception überprüfen, was dann letztendlich auf das selbe rauskommt. Eine eigene Exception wäre meiner Meinung nach sowieso sinnlos, weil man sowieso eine NullPointerException bekommen würde wenn die länge des arrays null ist.
 

Janus

Bekanntes Mitglied
war ja auch mein erster ansatz. mit NPE und IOOBE kann eigentlich jeder was anfangen und weiss sofort, woher der fehler kommt.

diese 'natürlichen' fehlerquellen nicht zu verwenden kann aber durchaus sinn machen, wenn man weiss, dass sie nicht sofort zu einer exception führen werden, sondern erst sehr viel tiefer irgendwo in den eingeweiden des frameworks (schonmal SWT verwendet? ;)) da ist es dann doch ratsam, sofort einen entsprechenden fehler am entry point zu schmeissen, um die fehlersuche nicht unnötig zu komplizieren.

außerdem wird so nochmal eindeutig vermittelt, dass dieser parameter eine fehlerhafte eingabe darstellt und nicht auf einen fehler im framework zurückzuführen ist. gibt ja immer wieder leute, die die api doc nicht lesen ;)
 
S

SlaterB

Gast
andre111 hat gesagt.:
Auch wenn man eine Exception wirft muss der, der die Funktion verwendet auf die Exception überprüfen, was dann letztendlich auf das selbe rauskommt. Eine eigene Exception wäre meiner Meinung nach sowieso sinnlos, weil man sowieso eine NullPointerException bekommen würde wenn die länge des arrays null ist.
RuntimeExceptions muss man nicht abfanegen, auch eigene Unterklassen nicht,

wieso ist eine eigene Excpeption sinnlos 'weil sowieso NullPointerException'?
wenn man eine eigene wirft, dann wird doch der Programmfluss geändert, dann kommt die NullPointerException nicht mehr (zumindest nicht in dieser Operation)
 

robochris

Aktives Mitglied
Wenn man die länge des arrays in der funktion überprüfen lässt besteht weiterhin die frage welchen sinnvollen wert man zurückgebekommt wenn die länge null ist.

Ehrlich gesagt, verstehe ich das Problem nicht. Wenn ein Null-Pointer reinkommt, kommt halt wieder ein Nullpointer raus. Oder z.B. NaN. Das ist doch eine ganz einfache Lösung.
 
M

maki

Gast
robochris hat gesagt.:
Wenn man die länge des arrays in der funktion überprüfen lässt besteht weiterhin die frage welchen sinnvollen wert man zurückgebekommt wenn die länge null ist.

Ehrlich gesagt, verstehe ich das Problem nicht. Wenn ein Null-Pointer reinkommt, kommt halt wieder ein Nullpointer raus. Oder z.B. NaN. Das ist doch eine ganz einfache Lösung.
"Ganz einfache Lösung" heisst in diesem Fall das ich prüfen muss ob NaN rauskommt???

Man kann keine Minimum in einem leeren Arrays feststellen, wäre unsinnig.
Anstatt nachher auf die Ausgabe zu prüfen, prüft man eben vorher.

NPEs sind üblicherweise Zeichen für Programmierfehler, sollten nicht "geschluckt" werden.
Fehlerhafte Parameter, wie zB ein leeres Array, sollten durch IllegalArgumentException gekennzeicnet werden.
 

Janus

Bekanntes Mitglied
robochris hat gesagt.:
Wenn man die länge des arrays in der funktion überprüfen lässt besteht weiterhin die frage welchen sinnvollen wert man zurückgebekommt wenn die länge null ist.

Ehrlich gesagt, verstehe ich das Problem nicht. Wenn ein Null-Pointer reinkommt, kommt halt wieder ein Nullpointer raus. Oder z.B. NaN. Das ist doch eine ganz einfache Lösung.

das problem ist, dass die methode dann einen gültigen (!) wert für sinnfreie parameter liefert und der caller u.U. damit weiterrechnet, was im endeffekt zu völlig abstrusem verhalten führt.
es ist grundsätzlich immer gut, gültige rückgabewerte zu liefern (z.b. leeres array statt null), wenn dies dem sinne der methode entspricht und es ermöglicht, sinnvoll damit weiterzuarbeiten. aber wenn anfängt, irgendwelche magic zurückzuliefern, die augenscheinlich gültig ist, aber lediglich die spezialantwort auf eine fehlerhafte eingabe ist, dann führt das sehr schnell zu undurchsichtigem und instabilem code.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T aus Integer Array Maximum bestimmen Java Basics - Anfänger-Themen 7
H Minimum und Maximum ausgeben lassen Java Basics - Anfänger-Themen 7
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
RudiRüssel Binäre Suche, unsortiert, lokales Maximum Java Basics - Anfänger-Themen 15
J Maximum herauskriegen mit foreach Java Basics - Anfänger-Themen 6
S Compiler-Fehler im array Maximum ermitteln Java Basics - Anfänger-Themen 6
M Maximum einer sinusfunktion (Spalt-Experiment) Java Basics - Anfänger-Themen 5
hello_autumn Maximum berechnen. Java Basics - Anfänger-Themen 17
K Maximum Suchen Array Java Basics - Anfänger-Themen 6
R Erste Schritte Minimum und Maximum in Array finden Java Basics - Anfänger-Themen 29
D VM Argumente - Das Maximum rausholen Java Basics - Anfänger-Themen 19
V Maximum berechnen ... Java Basics - Anfänger-Themen 20
S JSplitPane Divider Maximum Position Java Basics - Anfänger-Themen 5
D Maximum Subarray Problem; Problem mit der Rückgabe Java Basics - Anfänger-Themen 10
J Das Maximum einer Liste ermitteln Java Basics - Anfänger-Themen 8
S JAVA Methode für Maximum aus 4 ganzen Zahlen Java Basics - Anfänger-Themen 12
A Felder- Minimum/Maximum Java Basics - Anfänger-Themen 2
M Maximum, Minimum und Mittelwert berechnen Java Basics - Anfänger-Themen 25
B Applet, welches Maximum eines Array bestimmt Java Basics - Anfänger-Themen 2
P Lokales Minimum- Maximum, Globales Minimum - Maximum ? Java Basics - Anfänger-Themen 4
P Minimum/Maximum aus einer Liste Java Basics - Anfänger-Themen 3
Z Zahlenreihe maximum Java Basics - Anfänger-Themen 3
U Maximum zweier Zahlen ermitteln Java Basics - Anfänger-Themen 7
D Maximum werte eines Arrays bestimmen !!!??? Java Basics - Anfänger-Themen 13
S maximum zweier Zahlen Java Basics - Anfänger-Themen 1
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
MoxMorris Integer.MAX_VALUE und Double.MAX_VALUE Unterschied Java Basics - Anfänger-Themen 3
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
sserio printf integer formatting Java Basics - Anfänger-Themen 17
M Unterschied Integer.toString(x) und x.toString() Java Basics - Anfänger-Themen 22
H Uhrzeitespanne in Integer Wert umrechnen Java Basics - Anfänger-Themen 1
T Java Integer multiplizieren Java Basics - Anfänger-Themen 6
H Fehler bei integer Division Java Basics - Anfänger-Themen 28
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
C Integer in Vierer-Zahlblöcke aufteilen Java Basics - Anfänger-Themen 11
L integer Java Basics - Anfänger-Themen 6
Zeppi Integer umschreiben Java Basics - Anfänger-Themen 5
rafi072001 Integer Anomalie Java Java Basics - Anfänger-Themen 7
Eule25 Arbeit mit long und int, Error: integer number too large Java Basics - Anfänger-Themen 2
J Transformation zweier Integer in ein Double Java Basics - Anfänger-Themen 26
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
D Fibonacci overflow integer Java Basics - Anfänger-Themen 8
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2
V int zu Integer und String Java Basics - Anfänger-Themen 6
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
M Regex zum Integer.parseInt Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
S Letzte Zahl eines Integer auslesen? Java Basics - Anfänger-Themen 3
K String in Integer umwandeln Java Basics - Anfänger-Themen 4
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
D integer negativen Wert abspeichern Java Basics - Anfänger-Themen 3
A Mit JComboBox Ergebnis einen Integer aus einer anderen Klasse aufrufen. Java Basics - Anfänger-Themen 2
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
R Eingabe String umwandeln zu Integer Werten Java Basics - Anfänger-Themen 8
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
CptK Datentypen Integer ArrayList sortieren Java Basics - Anfänger-Themen 2
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
CptK Bestimmten Integer Wert aus Array filtern Java Basics - Anfänger-Themen 2
L String in Integer umwandeln Java Basics - Anfänger-Themen 3
K Datentypen String zu Integer parsen Java Basics - Anfänger-Themen 2
B Liste von Integer -> Nächster Wert bekommen Java Basics - Anfänger-Themen 5
S Integer aus Array filtern Java Basics - Anfänger-Themen 4
F Referenzvariable vom Typ "Integer" definieren. (Klausuraufgabe) Java Basics - Anfänger-Themen 5
M set Integer bzw. set null mit SQL DB Java Basics - Anfänger-Themen 9
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
B Variablen integer im Array Java Basics - Anfänger-Themen 5
C Liste o.ä. erstellen mit <Integer, <Integer, String> Java Basics - Anfänger-Themen 7
R Kompletten String umwandeln in Integer Java Basics - Anfänger-Themen 10
H 32-Bit Zahl (Integer) in eine IPv4 Adresse umwandeln? Java Basics - Anfänger-Themen 2
Orkanson Datentypen Integer in String umwandeln/hinzufügen Java Basics - Anfänger-Themen 3
O Datentypen Integer mit führender Null Java Basics - Anfänger-Themen 13
M Argument in Integer verwandeln und das Doppelte davon printen Java Basics - Anfänger-Themen 9
D Fehler: String zu Integer Java Basics - Anfänger-Themen 7
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
b1ck Integer initialisieren bei do-while-Schleife Java Basics - Anfänger-Themen 11
E Integer und Array übergeben Java Basics - Anfänger-Themen 9
W Fehler bei Integer.parseInt() Java Basics - Anfänger-Themen 4
R String in Integer Java Basics - Anfänger-Themen 11
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
J Integer in Array einlesen Java Basics - Anfänger-Themen 14
J Warum ist das ein Unterschied (Integer / int) Java Basics - Anfänger-Themen 2
H Integer in Datei schreiben Java Basics - Anfänger-Themen 2
B OOP Cannot instantiate the type AuDList<Integer> Java Basics - Anfänger-Themen 18
3 ArrayList Integer Wrapper Klasse als Ersatz für normale Arrays Java Basics - Anfänger-Themen 10
K Methoden Integer runden/aufrunden Java Basics - Anfänger-Themen 2
E Erste Schritte Lower Bounded Wildcards <? super Integer> Java Basics - Anfänger-Themen 1
M Datentypen Integer und Float Konflikt Java Basics - Anfänger-Themen 3
J Integer-Werte in Array ein- bzw. auslesen Java Basics - Anfänger-Themen 7
T Integer Wert in andere Methode übergeben Java Basics - Anfänger-Themen 2
N Probleme bei Speicherung eines Integer-Array in Datei speichern Java Basics - Anfänger-Themen 3
C Zwei Integer Arrays "kombinieren" Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben