Array Java erweitern

Sonnenblume123

Aktives Mitglied
Guten Abend,
die Aufgabe lautet:
Da man keine Integer als generische Parameter übergeben kann, sollen die Grenzen dem Konstruktor übergeben werden. Die Länge soll von der Methode length zurückgegeben werden. Den []-Operator implementieren die Methoden get und set. Um auf die Elemente zugreifen zu können,soll zu dem ein Iterator implementiert werden. Verwenden Sie hierzu eine innere Klasse. Verändern Sie außerdem keine vorgegebene Methodensignatur.
Dabei gilt es eine Arrayklasse zu implementieren, deren obere und untere Grenze statisch frei wählbar sind.
Der bereit gestellte Code:
Code:
import java.util.Iterator;

final public class Array<T> implements Iterable<T> {
   
    public Array(int L, int H) {
       
    }

    public T get(int index) {
       
        return null; }

    public void set(int index, T v) { }

    public int length() {
        return 0; }

    public Iterator<T> iterator() {
        return null; }

    // zu Testzwecken
    public static void main(String[] args) {
        Array<Integer> arr = new Array(-2, 1);
        // Array<Integer> arr = new Array(1, -1) arrError; <- Laufzeitfehler

        arr.set(-1, 42);

        System.out.println("arr.length = " + arr.length()); // 4
        System.out.println("arr[-1] = " + arr.get(-1)); // 42

        for(Integer i : arr)
            System.out.println("arr -> " + i); // null, 42, null, null
       
        for(int i : arr)
            System.out.println("arr -> " + i); // NPE

    }

Ich hab allgemein Probleme mit der Aufgabe.
Mein Programm ist falsch, an der Problemstelle möchte ich es gerne zu einem Object casten, dann hab ich zum Beispiel [] bereitgestellt.
Code:
import java.util.Iterator;

final public class Array<T> implements Iterable<T> {
    private Array<T> arr;
    private int length;
    private int left;
    private int right;
    public Array(int L, int H) {
        left = L;
        right = H;
        length = H + L + 1;
        arr = (Object) arr; //problemstelle
       
    }

    public T get(int index) {
   
        return arr[index-left];
    }
    public void set(int index, T v) {
        return arr[index-left];
    }

    public int length() {
        return arr.length() }

    public Iterator<T> iterator() {
        return null; }

    // zu Testzwecken
    public static void main(String[] args) {
        Array<Integer> arr = new Array(-2, 1);
        // Array<Integer> arr = new Array(1, -1) arrError; <- Laufzeitfehler

        arr.set(-1, 42);

        System.out.println("arr.length = " + arr.length()); // 4
        System.out.println("arr[-1] = " + arr.get(-1)); // 42

        for(Integer i : arr)
            System.out.println("arr -> " + i); // null, 42, null, null
       
        for(int i : arr)
            System.out.println("arr -> " + i); // NPE

    }
}

Falls ihr eine bessere Lösung habt, nehm ich gerne Vorschläge entgegen:)
 

X5-599

Top Contributor
Ok, erstes Problem: Du brauchst eine "Struktur", die deine Objekte in deiner Array-Klasse halten soll. Dafür möchtest du eine Instanz deiner Array-Klasse nehmen. Das bietet sich hier nicht an, da du diese Instanz ja erst einmal erzeugen müsstest. Es würde sich also der Konstruktor Array(int, int) immer wieder selber aufrufen... Deine Lösung (an der Problemstelle) mit dem Cast auf Object würde auch nicht zum Erfolg führen. Selbst wenn der Compiler das akzeptierte, wäre "arr" immer noch null.

Da ja die Grenzen bekonnt sind, wäre ein einfaches Array angebracht. Also z.B.: private T[] arr; Problem aber auch hier: Es muss erzeugt werden. So etwas wie: T[] arr = new T[2]; funktioniert aber nicht. Generische Arrays können nicht auf diese Weise erzeugt werden.
Es bleibt einem also nichts anderes übrig als ein Object Array zu benutzen.

Code:
private Object[] arr;

In deinem Konstrutor hast du alles was für desses Erzeugung benötigt wird:
Code:
int length = H + L + 1;
arr = new Object[length];

Vielleicht hilft dir das ja schonmal weiter?
 

httpdigest

Top Contributor
Außerdem:
int length = H + L + 1;
Die Anzahl der Elemente in einem ganzzahligen Intervall von L(inklusive) bis H(inklusive) berechnet sich NICHT durch H + L + 1. Wenn dein Array von 100 bis 101 geht, hat das ja dann nicht 202 Elemente, sondern eben nur 2.
Die korrekte Formel ist: H - L + 1, für deinen Fall, dass L und H inklusive sind.
 

Sonnenblume123

Aktives Mitglied
Hallo:)
Erstmal danke für die Hilfe:)
Kann mir jemand sagen, was hier noch falsch ist?
Code:
import java.util.Iterator;
import java.util.NoSuchElementException;

final public class Array<T> implements Iterable<T> {

    private Object[] arr;
    private int length;
    private int left;
    private int right;

    public Array(int L, int H) {
        left = L;
        right = H;
        length = H - L + 1;
        arr = new Object[length];

    }

    public T get(int index) {
        if (index < arr.length) {
            return (T) arr[index+left];
        }
        return null;
    }

    public void set(int index, T v) {
        v = (T) arr[index - left];

    }

    public int length() {
        return arr.length;
    }

    public Iterator<T> iterator() {
        MyIterator<T> iter = new MyIterator<T>();
        return iter;
    }

    public class MyIterator<E> implements Iterator<E> {

        private int position = -1;
        private E[] arr = null;

        public void setData(E[] elements) {
            this.arr = elements;
        }

        public boolean hasNext() {
            return this.position + 1 < this.arr.length;
        }

        public E next() throws NoSuchElementException {

            if (!hasNext()) {
                throw new NoSuchElementException("No more elements");
            }
            return this.arr[this.position + 1];
        }
    }

    // zu Testzwecken
    public static void main(String[] args) {
        Array<Integer> arr = new Array(-2, 1);
        // Array<Integer> arr = new Array(1, -1) arrError; <- Laufzeitfehler

        arr.set(-1, 42);

        System.out.println("arr.length = " + arr.length()); // 4
        System.out.println("arr[-1] = " + arr.get(-1)); // 42

        for (Integer i : arr)
            System.out.println("arr -> " + i); // null, 42, null, null

        for (int i : arr)
            System.out.println("arr -> " + i); // NPE

    }
}
 

httpdigest

Top Contributor
Die get(index) Methode ist noch falsch.
Beispiel:
Java:
Array<String> arr = new Array<>(100, 101);
arr.set(100, "a");
arr.get(100) -> null
du solltest selbst in der Lage sein, den Fehler in dieser Methode zu finden und zu beheben.
Ebenfalls ist die next() Methode vom Iterator falsch. Dort musst du irgendwann mal this.position inkrementieren. Außerdem kennt der Iterator das Array gar nicht. Er definiert unsinnigerweise ein eigenes lokales Feld, welches du aber nie setzt.
Und die set() Methode ist übrigens auch totaler Unsinn. Sie setzt ja gar nichts im Array.
 

httpdigest

Top Contributor
Die Syntax, die du suchst, ist: arr[index + left] = v
Lies dir doch erstmal generell die Syntax von Java durch. Am besten bezüglich des Zuweisungsoperators '=' und Arrays.
 

Sonnenblume123

Aktives Mitglied
Mein getter:
Code:
public T get(int index) {
        if (index < arr.length && index>= left) {
            return (T) arr[index];
        }
        return null;
    }

Mein setter:
Code:
    public void set(int index, T v) {
        if (index >= 1 && index < arr.length) {
            this.arr[index] = v;
        }
    }
 

httpdigest

Top Contributor
Mein getter:
Code:
public T get(int index) {
        if (index < arr.length && index>= left) {
            return (T) arr[index];
        }
        return null;
    }

Mein setter:
Code:
    public void set(int index, T v) {
        if (index >= 1 && index < arr.length) {
            this.arr[index] = v;
        }
    }
Nein, auch falsch. Denke erst ganz gaaaanz genau nach und spiele mögliche Beispiele für left, right und index durch.
 

Sonnenblume123

Aktives Mitglied
Nur um zu überprüfen, ob ich es richtig verstanden hab.
Meinst du zum Beispiel
arr.get(5)
Dann muss ich schauen, was meine linke Grenze ist und die hinzuaddieren. Jedoch muss ich schauen, ob das wiederum kleiner als meine rechte Kante ist. Und dann darf ich get aufrufen
 

httpdigest

Top Contributor
Dann muss ich schauen, was meine linke Grenze ist und die hinzuaddieren.
Überlege doch bitte erstmal selber, was das bedeuten würde. Also erstmal als Hintergrund: In Java sind Arrays immer 0-basiert. Das heißt, das erste Element in einem Java-Array (das Ding mit den [] Klammern dran) hat immer den Index 0 und das letzte Element hat immer den Index (arr.length - 1). Wenn du jetzt in deiner eigenen Array-Klasse einen anderen Startindex hast (dein "left"), dann musst du doch left nicht hinzuaddieren... das würde ja bedeuten, dass du bei index = 3 und left = 3 das Java-Array bei Index 6 zugreifst. Aber bei index = 3 und left = 3 müsste als tatsächlicher Zugriffsindex 0 herauskommen. Also musst du nicht left zu index hinzuaddieren, sondern?... :)

Und ich denke, es ist okay, keine if-Abfragen zu haben, sondern einfach den Aufruf bei tatsächlich ungültigem Index in eine ArrayIndexOutOfBoundsException laufen zu lassen.
 

Sonnenblume123

Aktives Mitglied
Also muss ich left subtrahieren!
Aha!
Könntest du mir nur sagen, wie ich über das Array iterieren kann? Weil in der inneren Klasse hab ich keinen Zugriff drauf.
 

mihe7

Top Contributor
Natürlich hast Du Zugriff darauf - allerdings vereinfacht es die Sache ungemein, wenn Du in der inneren Klasse das arr nicht nochmal deklarierst.
 

Sonnenblume123

Aktives Mitglied
Also wenn ich es so hab, klappt es nicht. (set noch nicht aktualisiert)
Code:
import java.util.Iterator;
import java.util.NoSuchElementException;

final public class Array<T> implements Iterable<T> {

    private Object[] arr;
    private int length;
    private int left;
    private int right;

    public Array(int L, int H) {
        left = L;
        right = H;
        length = H - L + 1;
        arr = new Object[length];

    }

    public T get(int index) {
        if (index < arr.length && index >= left) {
            return (T) arr[index-left];
        }
        return null;
    }

    public void set(int index, T v) {
        if (index >= 1 && index < arr.length) {
            this.arr[index] = v;
        }
    }

    public int length() {
        return arr.length;
    }

    public Iterator<T> iterator() {
        MyIterator<T> iter = new MyIterator<T>();
        return iter;
    }

    public class MyIterator<E> implements Iterator<E> {

        private int position = 0;

        public boolean hasNext() {
            return this.position + 1 < this.arr.length;
        }

        public E next() throws NoSuchElementException {

            if (!hasNext()) {
                throw new NoSuchElementException("No more elements");
            }
            int temp = position;
            position = position + 1;
            return this.arr[this.position + 1];
        }
    }

    // zu Testzwecken
    public static void main(String[] args) {
        Array<Integer> arr = new Array(-2, 1);
        // Array<Integer> arr = new Array(1, -1) arrError; <- Laufzeitfehler

        arr.set(-1, 42);

        System.out.println("arr.length = " + arr.length()); // 4
        System.out.println("arr[-1] = " + arr.get(-1)); // 42

        for (Integer i : arr)
            System.out.println("arr -> " + i); // null, 42, null, null

        for (int i : arr)
            System.out.println("arr -> " + i); // NPE

    }
}
 

mihe7

Top Contributor
Es ist nicht this.arr, einfach nur arr.

EDIT: im Iterator, versteht sich. Wenn Du im Iterator this schreibst, beziehst Du Dich auf das Iterator-Objekt. Dort existiert kein arr. Wenn Du this weglässt, wird implizit das arr aus dem umgebenden Objekt verwendet.

Man kann das arr des umgebenden Objekts auch explizit angeben, was im Fall von Namenskonflikten nützlich ist - damit will ich Dich jetzt aber nicht verwirren.
 
Zuletzt bearbeitet:
X

Xyz1

Gast
Hier Bitte:
Java:
/**
 * @param <T>
 */
final public class aArray<T> implements Iterable<T> {

    /**
     * @param args
     */
    public static void main(String[] args) {
        aArray<Float> b = new aArray<>(-5, 5);
        b.set(-5, (float) 0xC);
        b.set(-4, (float) 0xA);
        b.set(-3, (float) 0xF);
        b.set(-2, (float) 0xE);
        b.set(-1, (float) 0xE);
        b.set(-0, (float) 0xC);
        b.set(1 , (float) 0xA);
        b.set(2 , (float) 0xF);
        b.set(3 , (float) 0xE);
        b.set(4 , (float) 0xE);
        System.out.println("b : " + b);
    }

    Object[] array;
    int left, ri, len;

    public aArray(int l, int r) {
        if (l <= r) {
            left = l;
            ri = r;
            len = (r - l);
            array = new Object[len];
        } else {
            // überlege etwas....
        }
    }

    public T get(int index) {
        if (index >= left && index < ri) {
            return (T) array[index - left];
        } else {
            return null;
        }
    }

    public void set(int index, T v) {
        if (index >= left && index < ri) {
            this.array[index - left] = v;
        } else {
            // ignoriere
        }
    }

    public int length() {
        return len;
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            int index = left;
            @Override
            public boolean hasNext() {
                return (index < ri);
            }
            @Override
            public T next() {
                return get(index++);
            }
        };
    }

    @Override
    public String toString() {
        return "aArray{" + "array=" + StreamSupport.stream(((Iterable<T>) () -> iterator()).spliterator(), false)
                .map(Object::toString)
                .collect(Collectors.joining(", ")) + '}';
    }
}

Allerdings mag Stream null's nicht so sehr, daher aufpassen.

@mihe7 Na du bist ja eine. :D
 

Sonnenblume123

Aktives Mitglied
Kann mir jemand sagen, was hier falsch ist?
Code:
import java.util.Iterator;
import java.util.NoSuchElementException;

final public class Array<T> implements Iterable<T> {

    private Object[] arr;
   
    private int left;
    private int right;
    private int length;
    public Array(int L, int H) {
        left = L;
        arr = new Object[length];
        length = H - L + 1;
        right = H;
    }

    public T get(int index) {

        return (T) arr[index - left];

    }

    public void set(int index, T v) {
        this.arr[index - left] = v;
    }

    public int length() {
        return arr.length;
    }

    public Iterator<T> iterator() {
        MyIterator<T> iter = new MyIterator<T>();
        return iter;
    }

    public class MyIterator<E> implements Iterator<E> {

        private int position = -1;

        public boolean hasNext() {
            return this.position + 1 < arr.length;
        }

        public E next() throws NoSuchElementException {

            if (!hasNext()) {
                throw new NoSuchElementException("No more elements");
            }

            position = position + 1;
            return (E) arr[position];
        }
    }

    // zu Testzwecken
    public static void main(String[] args) {
        Array<Integer> arr = new Array(-2, 1);
        // Array<Integer> arr = new Array(1, -1);
        // Array<Integer> arr = new Array(-3,2);

        arr.set(-1, 42);

        System.out.println("arr.length = " + arr.length()); // 4
        System.out.println("arr[-1] = " + arr.get(-1)); // 42

        for (Integer i : arr)
            System.out.println("arr -> " + i); // null, 42, null, null

        for (int i : arr)
            System.out.println("arr -> " + i); // NPE

    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Java Array Java Basics - Anfänger-Themen 8
t2im Java Array-Länge ändern? Java Basics - Anfänger-Themen 22
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
M Quiz in Java programmieren mit Array Java Basics - Anfänger-Themen 8
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
S Java Array Länge aus anderer Klasse lesen Java Basics - Anfänger-Themen 1
X Java zweidimensionales Array Java Basics - Anfänger-Themen 5
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
M Wie kann ich im JAVA-GUI im Textfeld ein Array speichern Java Basics - Anfänger-Themen 4
B Java Array Fakultät Function Java Basics - Anfänger-Themen 5
E Wie wird in Java ein Char-Array terminiert ? Java Basics - Anfänger-Themen 15
kilopack15 Java Array Skalarprodukt testen Java Basics - Anfänger-Themen 21
T Variablen PHP Array jetzt für Java Java Basics - Anfänger-Themen 1
W Erste Schritte füllen Attribute java Klasse in for Schleife und Array Java Basics - Anfänger-Themen 16
X wie kann ich in bluej/java einene 2d array mit zahlen fuellen, so dass sich diese in der der zeilen Java Basics - Anfänger-Themen 2
J Java Array Zeichnung Skalieren und verschieben Java Basics - Anfänger-Themen 5
P Java : Array Fehler Java Basics - Anfänger-Themen 4
B Java rekursion minimum von ein array Java Basics - Anfänger-Themen 2
U JAVA - Ungerade Zahlen Array Java Basics - Anfänger-Themen 9
B Input/Output Formatierter Text aus PDF als Array auswerten in JAVA möglich ? Java Basics - Anfänger-Themen 8
T Erste Schritte Java ein Array Feld[index] zurueckgeben? Java Basics - Anfänger-Themen 20
U Kann man in Java ein Array zum Teil vorbelegen? Java Basics - Anfänger-Themen 4
J Java-Array abwechselnd Gross- und Kleinbuchstaben Java Basics - Anfänger-Themen 5
M Java spuckt Exeption bei Array aus Java Basics - Anfänger-Themen 2
T Collections Java Anfänger - Array-Struktur vollkommen unklar Java Basics - Anfänger-Themen 2
S Java Array Basic Java Basics - Anfänger-Themen 5
M java.util.ArrayList to java.sql.Array Java Basics - Anfänger-Themen 4
K Java Array Problem Java Basics - Anfänger-Themen 3
M Java Array - Durchschnitt Java Basics - Anfänger-Themen 7
S java array Java Basics - Anfänger-Themen 7
S JAVA Array Anwendersystem Java Basics - Anfänger-Themen 8
K java.lang.NullPointerException in Array bei Arraylistübergabe Java Basics - Anfänger-Themen 7
A Anfängerfrage - array required, but java.lang.String found Java Basics - Anfänger-Themen 7
J Ringpuffer als Array in Java ;-) Java Basics - Anfänger-Themen 3
B Java Array List größe auslesen zur Suchfunktion Java Basics - Anfänger-Themen 5
C Bäume in Java. Knoten in Array speichern Java Basics - Anfänger-Themen 3
C Java Array wie in PHP? Java Basics - Anfänger-Themen 9
S Java - Double-Array-Wertzuweisung erfolgt nicht Java Basics - Anfänger-Themen 4
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben