# Maximum werte eines Arrays bestimmen !!!???



## djmarom (6. Jan 2004)

HI Leute,   

brauche mal euren Rat:

wie schaffe ich es auf simple Weise den max. bzw. die max. Werte eines Arrays zu bestimmen, was nur
mit Integer-Werten gefüllt wird. 

aus diesem muß ich die größten Zahlen ermitteln...

Ciao  :shock:


----------



## neXus (6. Jan 2004)

Ich bin mir jetzt nicht sicher was du mit max. Werten genau meinst...

kannst du evtl ein wenig präziser werden? meinst du die grösse?...also die maximale anzahl der einträge die man machen kann?


----------



## stev.glasow (6. Jan 2004)

@neXus
 ich denke er meint den größten wert

@djmarom

```
import java.lang.reflect.Array;
import java.util.Arrays;
...
int len = Array.getLength(deinArray); // falls du len nicht hast
Arrays.sort(deinArray);
int max = deinArray[len - 1];
...
```


----------



## Ebenius (6. Jan 2004)

stevg hat gesagt.:
			
		

> ```
> import java.lang.reflect.Array;
> import java.util.Arrays;
> ...
> ...



 :!: An sich ist das richtig. Allerdings solltest Du die Länge des Arrays nicht so kompliziert ermitteln  :!: 

```
import java.util.Arrays; 
... 
Arrays.sort(deinArray); 
int max = deinArray[deinArray.length - 1];
```

Reflection ist dafür wirklich *nicht notwendig*.

Es grüßt Ebenius


----------



## Nobody (6. Jan 2004)

wenn das ganze nicht sortiert werden soll bzw es mehrere max werte gibt (kann je nach aufgabenstellung erwartet werden):
ersten wert nehmen, als max annehmen und dann mit jedem element vergleichen.
den/die indexe in einem array/int wert speichern (jenachdem ob 1 oder mehrere werte erforderlich sind):


```
//das array nen ich zahlen
int max=zahlen=[0];
len=zahlen.length;
int[] indexe= new int[len];
indAnz=1;
len[0]=0;
for(int i=1;i<len;i++){
   if(max<zahlen[i]){
     max=zahlen[i];
     indexe=new int[len];
     indexe[0]=i;
   } else if(max=zahlen[i]){
     indexe[indAnz]=i;
     indAnz++;
   }
}
//so hast du mehrere max werte und derren index gespeichert. nur sinnvoll, wenn du die liste wirklich nicht sortiert haben sollst, da das ganze etwas langsam ist (quicksort heist nicht umsonst quicksort).
```



wenn du das array sortiert hast und alle max werte (zb deren anz) brauchst, dann suchst du in dem sortierten array von hinten her solange, bis der wert != max ist. solange er ==max ist, erhöhst du einen wert der mitzählt, wie oft der wert vorkommt.


----------



## djmarom (6. Jan 2004)

Hi Leute,

danke für die schnelle Hilfe    . Selten so etwas ...

So was hatte ich mir auch in einer abgewandelten Form überlegt...

Habe mir jetzt bissl was gestrickt.

Ciao +thx  :shock:


----------



## stev.glasow (6. Jan 2004)

Ebenius hat gesagt.:
			
		

> stevg hat gesagt.:
> 
> 
> 
> ...



becstift hat mir auch erzählt dass deinArray.length besser ist - wenn ich ehrlich bin (und das bin ich) wusste ich gar nicht das es length gib. wo kommt das her ?  was haben die mit Array gemacht ? gibt es noch mehr solcher sachen ?


----------



## Ebenius (6. Jan 2004)

Du willst also die Maximalwerte aus dem Histogramm...

Ist nicht ganz simpel, geht aber:

```
public static void main(String[] args)
{
	int[] array = new int[]
	{
		1, 2, 2, 3, 1, 4, 5, 61, 24, 4, 3, 2, 1, 4, 2, 4, 5, 35234, 3, 12, 
		4, 1, 34, 1, 3, 4, 21, 4, 5, 52, 3, 3, 4, 3, 2, 1, 4, 3, 4, 2, 4, 3
	};
	
	final Map histogramMap = new HashMap(array.length);
	final Integer oneInteger = new Integer(1);
	int top = 0;

	// store the amounts (key is number, value is counter)
	for(int idx = 0; idx < array.length; idx++)
	{
		Integer key = new Integer(array[idx]);
		Integer countInteger = (Integer) histogramMap.get(key);
		
		if(countInteger == null)
		{
			histogramMap.put(key, oneInteger);
		}
		else
		{
			int count = countInteger.intValue() + 1;
			if(top < count)
				top = count;
			histogramMap.put(key, new Integer(count));
		}
	}

	// get the keys with highest amount, iterate over keys
	for(Iterator it = histogramMap.keySet().iterator(); it.hasNext();)
	{
		Integer key = (Integer) it.next();
		Integer value = (Integer) histogramMap.get(key);
		if(value.intValue() < top)
			it.remove();
	}

	System.out.println(histogramMap);
}
```

Ich liebe Collection-Framework! 

Noch fragen (hab's getestet!)

Es grüßt Ebenius


----------



## Ebenius (6. Jan 2004)

stevg hat gesagt.:
			
		

> wusste ich gar nicht das es length gib. wo kommt das her ? was haben die mit Array gemacht ? gibt es noch mehr solcher sachen ?


 :arrow: Arrays sind synthetische Objekte (Quasi-Hybride zwischen Objekt- und Primitivtypen). Daher kommt auch der Member _length_, welcher ein _final int_ ist. Damit sind Arrays auch größeninvariabel.

 :arrow: Arrays sind final, d.h. *folgendes geht nicht* (nicht so und nicht anders):

```
class A extends int[]
```

 :arrow: Arrays besitzen natürlich alle Methoden von _java.lang.Object_, wobei allerdings die _equals()_-Method und die _hashCode()_-Methode nicht überschrieben sind (wie man es vielleicht vermutet).

 :arrow: Auch _int[].class_ existiert und einhergehend _instanceof_

 :!: *Darüber nachdenken:*

```
int[][] iii = new int[0][0];
System.out.println(iii instanceof Object);
System.out.println(iii instanceof Object[]);
System.out.println(iii instanceof int[][]);
```
 *gibt in jeder Zeile true aus*  :!: 

Alle Klarheiten beseitigt?

Es grüßt Ebenius

PS: Wenn man das noch ein bisschen ausbaut, ist das was für die Java-FAQ.


----------



## stev.glasow (6. Jan 2004)

Ebenius hat gesagt.:
			
		

> Noch fragen (hab's getestet!)


na aber !


wozu brauchst du die HashMap ?

ich hätte es wie folgt gemacht:

```
int max = array[0];
int indexOfMax = 0; // kann man eventuell gebrauchen
for(int idx = 1; idx < array.length; idx++) 
{
      if(array[idx] > max)
      {
             max = array[idx];
             indexOfMax = idx;
      }
}
System.out.print("Der größte Wert ist " + max + " und hat den index " + indexOfMax);
```


----------



## Ebenius (6. Jan 2004)

... oder stand da vorhin nicht was davon, dass _djmarom_ wissen will, welche zahl(en) am häufgsten vorkommen.

Darauf bezieht sich mein vorangegangener Lösungsansatz nämlich (Histogram!)...

Wenn das nicht gewünscht ist (und dann müsste ich extrem geträumt haben) dann braucht man kein Collection-FrameWork. Kann es sein, dass hier eine Antwort nachträglich geändert/gelöscht wurde?

Mein Beispiel gibt aus: die Zahl vier ist mit elf mal am häufigsten vertreten. Ist natürlich was ganz anderes!

Es grüßt Ebenius


----------



## stev.glasow (6. Jan 2004)

Ebenius hat gesagt.:
			
		

> PS: Wenn man das noch ein bisschen ausbaut, ist das was für die Java-FAQ.



dann mach dich ran  :wink: 


hab es verstanden, aber wieso sind die genanten klassen (bis auf Object) nicht in der Java-API-Dokumentation aufgelistet ?


----------



## Ebenius (6. Jan 2004)

stevg hat gesagt.:
			
		

> wieso sind die genanten klassen (bis auf Object) nicht in der Java-API-Dokumentation aufgelistet ?


Die sind nicht in der API Doc, weil sie generisch/synthetisch sind und es unendlich viele geben kann! (_int[], int[][], int[][][], int[]...[], ...).

Dafür sind sie aber integraler Bestandteil der Sprachspezifikation. Die sind Quasi noch mehr low-level als String.

Es grüßt Ebenius_


----------



## stev.glasow (6. Jan 2004)

kennst du eine dokumentation die sich mit dem thema auseinander setzt.



> Kann es sein, dass hier eine Antwort nachträglich geändert/gelöscht wurde?


irgend wie war das eigendartig mein beitrag wurde vor deine gesetzt obwohl deine vorher schon da war
[schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1] mysteriös[/schild]
war hoffendlich ein einzelfall (die datenstruktur von phpbb hat sowieso ein paar eigenarten)


----------

