Matrix ohne Array erstellen

hellyeah

Neues Mitglied
Hallo liebe Leute, ich würde gerne mal fragen, wie man Matrix im Java ohne Array erstellen aber mit lineare Liste. ich danke euch im Voraus
 
Falls viele Einfüge-(add) und Löschoperationen (remove) durchgeführt werden: LinkedList<int>
Falls viele direkte Abfragen (get) erfolgen: ArrayList<int>

Oder die Lösung wie mein Vorredner, das Interface List nutzen.
 
Du kannst natuerlich jedes Array von beliebiger Dimension als Listen in selber Dimension abbilden.

Java:
int[][][] == List<List<List<Integer>>>

Allerdings musst du hierbei auf Autoboxing ein wenig aufpassen. Waehrend ein Array aus jedem Typ, inklusive Primitiven bestehen kann (also "int"), koennen Listen nur Objekte aufnehmen (also "Integer"). Die Konvertierung zwischen den beiden Typen nennt sich Autoboxing und wird meistens transparent vom Compiler uebernommen. Beispiel:

Java:
int primitive = 5;
Integer object = new Integer(7);

int resultPrimitive = primitive + object;
Integer resultObject = primitive + object;

Im Hintergrund wird dies automatisch zu:

Java:
int primitive = 5;
Integer object = new Integer(5);

int resultPrimitive = primitive + object.intValue();
Integer resultObject = Integer.valueOf(primitive + object.intValue());

Du merkst also dass die "einfache" Addition ploetzlich zu mehreren Funktionsaufrufen auf Objekten wird. Dies kann sehr unfoerderlich fuer die Performance sein, also sollte man das immer im Hinterkopf behalten. Das gilt auch alles fuer Vergleiche:

Java:
primitive == object // false
primitive == object.intValue() // true
Integer.valueOf(primitive) == object // Undefiniert
new Integer(primitive) == object // false

Die Sache mit "Integer.valueOf" ist die, dass dahinter eventuell ein Objet-Cache steht, oder vielleicht auch nicht, dass ist ein Implementierungs-Detail der JVM. In OpenJDK gibt es tatsaechlich einen Cache fuer die Werte von -128 bis 127, was dann zu diesem Verhalten fuehrt:

Java:
Integer.valueOf(7) == Integer.valueOf(7) // true
Integer.valueOf(-128) == Integer.valueOf(-128) // true
Integer.valueOf(127) == Integer.valueOf(127) // true

Integer.valueOf(-300) == Integer.valueOf(-300) // false
Integer.valueOf(1024) == Integer.valueOf(1024) // false

Behalte das also im Hinterkopf wenn du mit "int" und "Integer" arbeitest, insbesondere wenn du das Boxing/Casting nicht explizit machst.
 
Als Nachsatz, du kannst natuerlich auch nur mit einer einfachen Liste arbeiten, und den Offset dann haendisch berechnen:

Java:
int columns = 25;
int rows = 25;

List<Integer> matrix = new ArrayList<>();

matrix.get(positionY * rows + positionX);
 
oder du baust dir einfach mal eine eigene Struktur...eine Liste zu schreiben ist nicht shcwer hab ich auch gmeacht für mein Programm

Java:
package controller;

public class AmountList {
      Node head;
      public AmountList() {
          head = new Node (null,null);
      }
      public void increase(String name)
      { 
          Boolean checker = true ;
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==name) {
                  n.next.amount++;
                  checker = false;
              }
              n=n.next;
          }
          if(checker) n.next=new Node(name,n.next);
      }
      public void decrease(String name)
      { 
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==name) {
                  if(n.next.amount-1 == 0) {
                      delete(n.next);
                      break;
                  }
                  else n.next.amount--;
              }
              n=n.next;
          }
      }
      private void delete(Node toDelete) {
          Node n=head;
          while( n.next !=null )
          {
              if(n.next==toDelete) {
                  n.next = toDelete.next;
                  break;
              }
              n = n.next;
          }
      }
      public int getMyCardAmount(String nameOfCard) {
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==nameOfCard) return n.next.amount;
              n=n.next;
          }
          return 0;
      }
      private class Node
      {
          String cardName;
          Node next;
          int amount = 1;
        public Node(String cardName ,Node n) {
          this.cardName = cardName;
            next = n;
        }
      }
    }

das kannst dir dann umbauen wie du lustig bist um deine matrix zu haben
 
oder du baust dir einfach mal eine eigene Struktur...eine Liste zu schreiben ist nicht shcwer hab ich auch gmeacht für mein Programm

Java:
package controller;

public class AmountList {
      Node head;
      public AmountList() {
          head = new Node (null,null);
      }
      public void increase(String name)
      {
          Boolean checker = true ;
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==name) {
                  n.next.amount++;
                  checker = false;
              }
              n=n.next;
          }
          if(checker) n.next=new Node(name,n.next);
      }
      public void decrease(String name)
      {
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==name) {
                  if(n.next.amount-1 == 0) {
                      delete(n.next);
                      break;
                  }
                  else n.next.amount--;
              }
              n=n.next;
          }
      }
      private void delete(Node toDelete) {
          Node n=head;
          while( n.next !=null )
          {
              if(n.next==toDelete) {
                  n.next = toDelete.next;
                  break;
              }
              n = n.next;
          }
      }
      public int getMyCardAmount(String nameOfCard) {
          Node n=head;
          while( n.next !=null )
          {
              if(n.next.cardName==nameOfCard) return n.next.amount;
              n=n.next;
          }
          return 0;
      }
      private class Node
      {
          String cardName;
          Node next;
          int amount = 1;
        public Node(String cardName ,Node n) {
          this.cardName = cardName;
            next = n;
        }
      }
    }

das kannst dir dann umbauen wie du lustig bist um deine matrix zu haben
Bitte nicht dieses Beispiel verwenden. Eine eigene Liste zu implementieren ist scheinbar doch nicht so leicht.
 
Also eigene Abstrakte Datentypen zu schreiben ist meist schlicht unnötig. Was man braucht, findet man in der Regel direkt in den Collections vom Java Framework. Und das incl. der Implementation aller wichtigen Interfaces so dass auch die Interaktion sicher gestellt ist.

Das vermeintliche ‚Ich mach da schnell etwas in 5 Minuten‘ hatten wir schon öfters hier im Forum und da hatte sich eigentlich immer gezeigt, dass dies nicht wohl durchdacht war und es dann schnell komplexer wurde ...

@Joreyk: Ist vielleicht eine nette Übung für Dich: schau dir mal die Üblichen Interfaces an und implementiere diese für Deine Liste. Das sind Dinge, die ich immer sehr Interessant fand und man lernt / vertieft da doch einiges meine ich.
 
Also eigene Abstrakte Datentypen zu schreiben ist meist schlicht unnötig. Was man braucht, findet man in der Regel direkt in den Collections vom Java Framework. Und das incl. der Implementation aller wichtigen Interfaces so dass auch die Interaktion sicher gestellt ist.

Das vermeintliche ‚Ich mach da schnell etwas in 5 Minuten‘ hatten wir schon öfters hier im Forum und da hatte sich eigentlich immer gezeigt, dass dies nicht wohl durchdacht war und es dann schnell komplexer wurde ...

@Joreyk: Ist vielleicht eine nette Übung für Dich: schau dir mal die Üblichen Interfaces an und implementiere diese für Deine Liste. Das sind Dinge, die ich immer sehr Interessant fand und man lernt / vertieft da doch einiges meine ich.
Java - The List Interface - Tutorialspoint

ich hatte mir das angeschaut und es hat sich raus gestellt dass ich "das meiste" gar nicht brauche

es darf zb gar nicht möglich sein ein Objekt auszugeben an einer stelle oder ein Objekt an einer stelle einfach so zu lesen
 

Neue Themen


Zurück
Oben