2016-05-18 5 views
0

Ich arbeite gerade an einem Programm, wo ich eine große Menge von Objekten habe (alle Elemente aus dem Periodensystem) und es wäre ein großer Schmerz, eine Liste erstellen zu müssen über 100 Objekte. Gibt es eine Möglichkeit, alle Objekte einmal zu deklarieren und zu instantiieren und eine Methode zu haben, die die Klasse liest, in der sie existieren? Wenn ein Benutzer beispielsweise "He" eingibt, kann ich das entsprechende Objekt finden, das das Element "Symbol" "He" enthält. Ich müsste in der Lage sein, jedes Objekt mit der Methode getSymbol zu überprüfen, die ihr Symbol zurückgibt und es dann mit der Eingabe vergleicht. Danach plane ich, andere dem Objekt zugewiesene Felder zu verwenden, so wie es die molare Masse für Berechnungen ist, aber das wird kein Problem sein. Wenn es einen anderen Weg gibt, dies effektiv zu tun, wäre dies sehr zu begrüßen.Wie finde ich ein Objekt ohne eine ArrayList

+1

Warum möchten Sie nicht ArrayList verwenden? Für mich klingt das nach dem perfekten Anwendungsfall dafür. – moscar

+0

@moscar Genau das, was ich auch dachte. Fügen Sie einfach die Elementklassen zu einer Array-Liste hinzu und verwenden Sie Lambda, um basierend auf der ID des Elements auszuwählen, was erforderlich ist. – ManoDestra

+0

Dieser Typ hat es auch mit enums getan: https://gist.github.com/felixdivo/11159677. Dies ist, was @Vovka in seiner Antwort unten vorgeschlagen hat. Ein Enum ist eine elegante Lösung für diese Anforderung angesichts der konstanten Natur des Periodensystems. – ManoDestra

Antwort

3

Sie sollten alles in ein Map mit den elementSymbol als Schlüssel und Ihrem object als Wert speichern, dann werden Sie in der Lage sein, durch map.get(elementSymbol) Aufruf zu Ihrem Objekt zuzugreifen.

Weitere Details über die Klasse Maphere

1

können Sie eine hashmap für diese.

HashMap<String,PeriodObject> peridicTable = new HashMap<String,PeriodObject>(); 
periodictable.add("he",object); 
periodicTableobject = periodictable.get("he"); 
3

Wie Sie konstante Anzahl von Objekten, ist es besser, sie mit ENUM verwalten:

public enum Elements { 
    ag(10), //10 here is the molarMass constructor parameter 
    he(20); 

    //constructor if needed 
    Elements(int molarMass) { 
     this.molarMass = molarMass; 
    } 

    //extra fields 
    final private int molarMass; 
} 

get:

Elements.valueOf("he") 
+0

Wie könnte ich in der Lage sein, diese Klasse zu durchsuchen oder jedes Enum gegen eine Eingabe zu überprüfen? Ich bin nicht sehr vertraut mit enums –

+0

Element he = Element.valueOf ("er");/* "he" seine Eingabezeichenfolge */ int m = he.getMolarMass(); – Vovka

0

nicht sicher, warum Sie abgeneigt sind ein zu verwenden ArrayList ist eine perfekte Lösung für Ihre Anforderungen. Ich denke, die Verwendung einer Enumeration ist die bessere Lösung angesichts der konstanten Natur des Periodensystems, aber ich füge diese List-Antwort hinzu, indem ich die Stream-API der Vollständigkeit halber verwende.

import java.util.ArrayList; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     Test test = new Test(); 
     test.run(); 
    } 

    private void run() { 
     List<Element> elements = new ArrayList<>(); 
     Element oxygen = new Element("O", "Oxygen"); 
     Element carbon = new Element("C", "Carbon"); 
     Element hydrogen = new Element("H", "Hydrogen"); 
     Element helium = new Element("He", "Helium"); 
     elements.add(oxygen); 
     elements.add(carbon); 
     elements.add(hydrogen); 
     elements.add(helium); 

     System.out.println("All Elements:"); 
     for (Element element : elements) { 
      System.out.println("\t" + element); 
     } 

     System.out.println(); 

     Element oxy = elements.stream().filter(e -> e.getId().equals("He")).findFirst().get(); 
     System.out.println("Specific Element: " + oxy); 
    } 

    private class Element { 
     private final String id; 
     private final String name; 

     public Element(String id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public String getId() { 
      return this.id; 
     } 

     public String getName() { 
      return this.name; 
     } 

     @Override 
     public String toString() { 
      return this.getName() + " [" + this.getId() + "]"; 
     } 
    } 
} 
+0

Es war mühsam genug, jedes Element manuell eingeben zu müssen, und ich dachte mir, dass es einen effizienteren Weg geben musste, um auf sie zuzugreifen. Ich wollte wirklich nicht zurück gehen und list.add() über 100 Mal machen. Ich bin mir sicher, dass es eine bessere Möglichkeit gibt, das mit einer Liste zu tun, aber die Verwendung einer Enum, um sie zu halten, hat viel besser funktioniert –

Verwandte Themen