Array/Liste ohne Obergrenze

Hijo2006

Aktives Mitglied
Hallo

ich habe eine zu Beginn des Programms unbekannte Anzahl an Werten, die ich
dann gerne in ein Array oder eine Liste speichern mag, um dann jeweils den Min/Max-Wert zu bestimmen.

Danke
 
ich lese aus einer datei werte ein, deren Umfang vorher nicht bekannt ist.
Diese will ich dann analysieren auf Min/Max und evt Summen.
Aber vielleicht mach ich es anders und bewerte Zeilenweise
beim Einlesen Min/Max
 
ich brauche nur die finalen Werte wie Min/Max und ggf. die Summe.
Klar- ich kann beim Einlesen jeweils Min/Max neu bewerten, dachte nur,
dass es evt. eine Varinate gibt, alles in eine Liste/Array o.ä. zu schieben
und mit einer Methode .Max oder .Min analog wie Math.Min oder Math.Max
die Daten abzugreifen.
Es geht mir nur drum, dass es am schnellsten geht. bzw ich wieder was neues
lerne
Eine machbare Variante habe ich schon 😀
 
Sobald du eine Zeile einliest sofort die Werte berechnen. Das ist am Speichereffizientesten und Laufzeittechnisch gesehen auch am schnellsten.
Erst in eine Liste einlesen und dann sortieren ist gerade nicht langsam, aber auch nicht flott und verbraucht unnötigen Speicherplatz.
 
@ TO : Nicht, wenn du das nicht selber machen willst. Ich mache das ja liebend gerne selber. Ja, Arrays habn eine feste Größe, andere, Listen, sind dynamisch. Allerdings könntest du bei Arrays Speicherplatz-Overhead einsparen. Ich bereite mal ein Beispiel vor...
 
So könntest du anfangen (nicht besonders super, aber es geht):
Java:
package javaapplication;

import java.util.Arrays;
import java.util.Random;

public class Temp {

    private static int[] array = new int[0];
    private static int min = 0;
    private static int max = 0;
    private static long sum = 0;

    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            add(random.nextInt(15) - 5);
        }

        System.out.println(Arrays.toString(array));
        System.out.println("min = " + min);
        System.out.println("max = " + max);
        System.out.println("sum = " + sum);
        System.out.println("avr = " + (double) sum / array.length);
    }

    private static void add(int i) {
        int[] neu = new int[array.length + 1];
        System.arraycopy(array, 0, neu, 0, array.length);
        neu[neu.length - 1] = i;

        if (i < min) {
            min = i;
        }
        if (i > max) {
            max = i;
        }
        sum += i;

        array = neu;
    }
}

Code:
[7, -3, 1, -5, 9, 5, 7, 4, -3, -2]
min = -5
max = 9
sum = 20
avr = 2.0

Ich teste das mal mit höherer Schleife und Laufzeit,
Java:
    public static void main(String[] args) {
        Random random = new Random();
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            add(random.nextInt(15) - 5);
        }
        long t2 = System.currentTimeMillis();

        // System.out.println(Arrays.toString(array));
        System.out.println("min = " + min);
        System.out.println("max = " + max);
        System.out.println("sum = " + sum);
        System.out.println("avr = " + (double) sum / array.length);
        System.out.println(t2 - t1);
    }

Dauert alleine schon 4 Sekunden, aber dann hat die CPU was zu tun.

Warum dauert das so lange? Naja, das liegt auf der Hand. Das Vergrößerungs-Verhalten. Ein besseres brauchen wir jetzt Mathematik. Du kannst das ja mal mit ArrayList vergleichen, welche auch ein wenig Speicherplatz-Overhead inne hat.
 
Arrays (richtig "gemacht"): schnell, fix
Listen: langsam, dynamisch
Stimmt ihr mir da wenigstens zu?

Übrigens... Die Laufzeit oben müsste (n*n) sein (oder ist es sogar mehr? oder ist es sogar n*n*n?) + reichlich Overhead und Verwaltungsaufwand (wirklich schlimm), damit der Speicher nicht unendlich wird, muss der GC jedes Mal ran.
 
Arrays (richtig "gemacht"): schnell, fix
Listen: langsam, dynamisch
Stimmt ihr mir da wenigstens zu?
Ja und Nein. Listen können intern auch nur Arrays sein.
Array und Liste (richtig "gemacht"): schnell
Array und Liste (falsch "gemacht"): langsam

Übrigens... Die Laufzeit oben müsste (n*n) sein (oder ist es sogar mehr? oder ist es sogar n*n*n?)
Müsste O(n^2) sein, wo soll denn das dritte *n herkommen?


damit der Speicher nicht unendlich wird, muss der GC jedes Mal ran.
Jedes Mal muss er da keineswegs ran 😉 Außerdem dürfte der recht schnell sein (wenn ich grad den richtigen GC im Kopf hab), gibt ja kaum Objekte, die überleben, das meiste ist ja Garbage..
 
ich brauche nur die finalen Werte wie Min/Max und ggf. die Summe.
Klar- ich kann beim Einlesen jeweils Min/Max neu bewerten, dachte nur,
dass es evt. eine Varinate gibt, alles in eine Liste/Array o.ä. zu schieben
und mit einer Methode .Max oder .Min analog wie Math.Min oder Math.Max
die Daten abzugreifen.
Es geht mir nur drum, dass es am schnellsten geht. bzw ich wieder was neues
lerne
Eine machbare Variante habe ich schon 😀

In der Standard Api nicht, nein. Aber wie gesagt, es wurde eine Lib vorgeschlagen. Oder selber machen und nicht das von mir heranziehen...

@mrBrown: Arrays können niemals langsam sein. 😀 Es kommt immer darauf an, was man mit anstellen möchte. Listen hingegen sind erst mal langsam, da eine Methode aufgerufen werden muss. Aber langsam ist hier seeehr relativ.

Na-ja, heute keine Lust auf Streitigkeiten.
 
In der Standard Api nicht, nein. Aber wie gesagt, es wurde eine Lib vorgeschlagen. Oder selber machen und nicht das von mir heranziehen...

Files.lines, #mapToInt und #summaryStatistics sind Standard-API (java.util und java.nio) und keine externe Lib^^

@mrBrown: Arrays können niemals langsam sein. 😀 Es kommt immer darauf an, was man mit anstellen möchte. Listen hingegen sind erst mal langsam, da eine Methode aufgerufen werden muss. Aber langsam ist hier seeehr relativ.
Mit schlecht gemachten Arrays meinte ich sowas wie die Array-Benutzung in deinem Beispiel, da wären einige Listen schneller 😉
 
Hallo

ich habe es inzwischen mit einem Vector gelöst.
Der macht exakt, was ich will und liefert meine Ergebnisse.

Danke euch allen für den wertvollen Input
 
Danke.
Seid mir nicht böse, ich habe nicht ansatzweise euer Niveau und das Wissen,
so dass ich es bewerten oder gar abschätzen kann.
Ich kann nur sagen, es läuft für meine Zwecke und auch performant..Unter
200msec.

Mein Programmieren würde euch eh die Haare zu Berge stehen lassen, aber
für meine 8Wochen in Java habe ich schon im Ergebnis für mich Sachen hinbekommen.
Das Tool macht was es soll und da es für Eigenbedarf kann ich auch mit meine
Verstössen gegen die reine Lehre verstossen.. smile
 
Danke.
Seid mir nicht böse, ich habe nicht ansatzweise euer Niveau und das Wissen,
so dass ich es bewerten oder gar abschätzen kann.
Ich kann nur sagen, es läuft für meine Zwecke und auch performant..Unter
200msec.
Zum Lernen bist du doch hier 😉
Aus'm JavaDoc:
If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector.

ArrayList macht das gleiche wie Vector, nur ohne Threadsicherheit, und ist damit deutlich schneller 😉
 
Glaub mir, das merke ich nicht mal. ich drück drauf und es geht das ergebnis auf.
Aber danke für den Hinweis- sowas merke ich mir immer ganz gerne 🙂
 
Hab es aber dennoch geändert. Ging fix. Die Deklarationssyntax die gleich und nur die Aufrufmethode für das Element an der Stelle i geändert 🙂
 

Neue Themen


Zurück
Oben