Zweidimensionales Array nach bestimmtem Objekt durchsuchen

MasterPu

Grünschnabel
Hi ich brauch dringend Hilfe zum Thema Arrays. Und zwar hab ich mir ein Array gebastelt, das den Lagerbestand zweier Spielewarenregale repräsentieren soll. Mit Hilfe dieses Arrays kann ich jetzt die einzelnen Regale auch bestücken, allerdings möchte ich jetzt noch, dass es möglich ist, nach einem bestimmten Artikel (zum Beispiel "Modellauto" ) , der vorher hinzugefügt wurde, zu suchen, und dann angezeigt zu bekommen, an welcher Position [Regal][Fach] er sich im Array, also im Lager befindet PLUS seine weiteren Attribute "groesse" und "gewicht". Das sollte dann etwa so aussehen:

Modellauto: Lagerplatz 2/5 (Regal 2 , Fach 5) , groeße 10 (repräsentiert einfach irgendeine größe) , gewicht 350g .

In welcher Reihenfolge ist hierbei egal es kann auch erst der Lagerplatz angezeigt werden und dann der Artikelname. Aber es muss möglich sein in die Suche "Modellauto" einzugeben. Leider finde ich im internet nur verwirrende Beispiele die sich nur auf Zahlen als Werte von Arrays beziehen und es fällt mir schwer das dann auf meine Aufgabe anzuwenden. Jetzt die Frage:

Was benötige ich dafür?

Mein Code

Code:
import java.util.Arrays;
/**
 * Klasse für Lagerregale (Alle die es im Lager geben soll)
 * 
 *
 * 
 */
public class Lagerregale
{
   private int[][] faecher;
   /**
   *
   *
   * 
   */
   public Lagerregale()
      {
         faecher = new int [2][10];
         
       
      }
   /**
    * Spielwarenregal 1 mit Spielwaren befüllen
    * 
    */           
   public void spielWarenRegal1(int fach, int groesse, int gewicht, String bezeichnung)
   {
        faecher[0][fach] = groesse;
       
           
   }
   /**
    * Spielwarenregal2 mit Spielwaren  befüllen
    * 
    */   
   public void spielWarenRegal2(int fach, int groesse, int gewicht, String bezeichnung)
   {
        faecher[1][fach] = groesse;
        
               
   }
   
}

Vielen Dank!
 

Harrier

Erfahrenes Mitglied
Hi,

ich bin mir noch nicht ganz sicher, ob ich verstanden habe, was du machen willst. Wenn ich das richtig sehe, möchtest du zwei Regale voller Spielwaren haben, die du mit Gegenständen befüllen kannst, und in denen du danach nach einem Gegenstand suchen möchtest. Außerdem hat jeder Gegenstand einige Eigenschaften, z.B. einen Namen (nach dem du dann suchst), eine Größe und ein Gewicht. Liege ich soweit richtig?

In diesem Fall solltest du eine zweite Klasse erstellen, nennen wir sie Spielzeug, die in etwa so aussehen könnte:
Code:
public class Spielzeug
{
    public String name;
    public int groesse;
    public int gewicht;

    // sinnvoll wäre es hier auch einen konstruktor zu erstellen
    public Spielzeug(String name, int groesse, int gewicht)
    {
        this.name = name;
        this.groesse = groesse;
        this.gewicht = gewicht;
    }
}

Dein faecher-Array muss dann nicht mehr den Typ int, sondern den Typ Spielzeug haben. Deine spielWarenRegal1-Methode würde dann wohl eher spielWarenRegal1(int fach, Spielzeug s) heißen. (Alternativ könntest du auch spielwarenRegal(int regal, int fach, Spielzeug s) für beide Regale nehmen).

Etwas schwieriger wird in deiner Architektur das Suchen. Das liegt daran, dass du ja zwei int-Werte (Regal und Fach) sowie das Objekt zurück bekommen möchtest (um Gewicht und Größe zu erfahren). Java erlaubt aber nur einen Rückgabewert, nicht drei. Es gibt Programmiersprachen, in denen man sich hier elegant mit sog. pass-by-reference-Parametern helfen könnte, diese gibt es in Java aber nicht.

Du hast aber Glück im Unglück, da du nur int-Werte bekommen möchtest. ("Modellauto" ist zwar ein String, aber den kennst du ja vor der Suchanfrage schon). Für diesen Fall gibt es ein Work-Around: Deine Suchfunktion übergibt einfach ein Array von int-Werten:

Code:
public int[] search(String name)
{
    for(int r = 0; r < faecher.length; r++)
    {
        for(int f = 0; f < faecher[r].length; f++)
        {
            if(faecher[r][f].name.equals(name))
            {
                return new int[] { r, f, faecher[r][f].groesse, faecher[r][f].gewicht }
            }
        }
    }

    return null;
}

Die Funktion geht beide Regale Fach für Fach durch und schaut, ob sich darin ein Spielzeug mit dem gesuchten Namen befindet. Wenn sie eines findet, gibt sie ein int-Array zurück bei dem der 0-te Eintrag die Regalnummer darstellt, der 1-te die Fachnummer innerhalb des Regals, der 2-te die Größe und der letzte das Gewicht. Findet sie nichts, wird null zurückgegeben.

Viele Grüße,
Harrier
 

MasterPu

Grünschnabel
Ja das verstehst Du goldrichtig und vielen Dank für die Antwort! Leider versteh ich jetzt nicht was du meinst mit
Dein faecher-Array muss dann nicht mehr den Typ int, sondern den Typ Spielzeug haben.
?

Kannst Du mir das näher erläutern? Ich brauch das int doch um die größe des Arrays zu definieren [2][10].

:confused:

Also im Prinzip erstell ich doch in der Klasse des Arrays ein neues Array, mit der Größe [2][10] .Dann erstelle ich in derselben Klasse, eine neue Instanz , also ein neues Objekt der Klasse Spielzeuge, mit beliebigen Attributen und speichere das Objekt an einer beliebigen Position im Array.

Das heisst, die Arrayklasse (genannt Lagerregale) greift jetzt auf die Spielzeugklasse zu. Kann man das so sagen?

Bitte um Verständnis. Für mich ist das alles höchst verwirrend und mir fällt es schwer da einen Zugang zu finden. Muss es aber machen und möchte es nicht machen lassen sondern verstehen.
 

Harrier

Erfahrenes Mitglied
Also, Lagerregale-Klasse hat ein Array, das in deiner Variante den Typ int hat:
private int faecher[][];
Daraus solltest du ein Array vom Typ Spielzeug machen:
private Spielzeug faecher[][];
Natürlich verwendest du trotzdem Zahlen um die Größe des Array anzugeben, wenn du es dann erstellst. (Also new Spielzeug[2][10]). Aber dann ist es eben ein Array, das Instanzen der Klasse Spielzeug enthält, nicht int-Werte.

Wo du nun das Spielzeug-Objekt erstellst ist relativ irrelevant. Das könnte durchaus in einer dritten Klasse geschehen. Oder in deiner main-Methode. In jedem Fall verwendest du dann die spielWarenRegal-Methoden um dieses Objekt in das Array einzufügen.

Die Lagerregale-Klasse greift zumindest in der Suchfunktion auf Attribute der Spielzeug-Klasse zu. z.B.:
Code:
faecher[r][f].groesse

greift auf das Attribut "groesse" des Spielzeug-Objekts in Regal r, Fach f zu. Mir fällt da übrigens gerade auf, bevor zu so einen Zugriff machst musst du noch überprüfen, ob dieses Fach nicht leer ist; z.B. mit
Code:
if(faecher[r][f] == null) continue;
vor der anderen if-Abfrage.