2012-03-24 11 views
2

In meiner Anwendung habe ich kleine Tabellen (Dateien) mit eindeutigen Schlüsseln (die meisten von ihnen haben zwei oder mehr Felder - komponierte Schlüssel). Ich möchte eine Klasse für jede dieser kleinen Tabellen erstellen und die Daten in eine Java-Sammlung laden. Dieses Objekt liest die Datei und lädt die Daten in eine Java-Sammlung. Ich möchte dann die Daten aus dieser Sammlung mit den Schlüsselwerten abholen, um auf alle Felder zugreifen zu können. Meine Frage ist, welche Sammlung ich verwenden oder sagen soll, welche Sammlung mehrere Schlüssel unterstützt? Ein Link zu einem Examen ist großartig. Danke im Voraus!Welche Java-Sammlung eignet sich am besten für dieses Szenario

+0

Nicht ganz sicher, was Sie mit mehreren Schlüsseln meinen. Können Sie ein Beispiel geben? –

+0

Zum Beispiel enthält ein Datensatz zehn Felder, aber die ersten beiden Felder, sagen Fld1 und Fld2 machen diesen Datensatz einzigartig. Um also den Datensatz aus der Java-Sammlung zu speichern und zu ziehen, sollten diese beiden Schlüsselfelder übereinstimmen. Wie Abfrage wo xyz.FLD1 = "AA" und xyz.FLD2 = "123". – Peter

Antwort

2

Nicht ganz sicher, was Sie durch mehrere Schlüssel bedeuten. Eine Klasse pro 'Tabelle', die Sie in einer Sammlung speichern und mit einem Schlüssel/Wert-Paar abrufen können, sagt mir HashMap.

+0

user181533 - Das stimmt auch. Eine HashMap pro Tabelle, wobei key eine Kombination aus zwei Feldern ist. Also wird das so funktionieren: Abfrage auf Tabelle, um alle Zeilen (Objekte) zu erhalten und eine Querylist und dann eine Liste aus QueryList zu erstellen. Dann iteriere auf List, um eine HashMap zu erstellen, richtig? So kann das alles im Konstruktor gemacht werden.Erstellen Sie anschließend eine Methode, die Argumente für den Schlüssel übernimmt und das Tabellenobjekt aus HasMap zurückgibt. Da ich neu hier bin, korrigiere mich bitte, wenn mein Verständnis nicht stimmt. Danke, – Peter

+0

user181533 Ich gehe mit Ihrer Antwort und natürlich wer auch immer HashMap vorgeschlagen hat, aber Sie möchten bestätigen, wenn mein Ansatz zum Erstellen und Abrufen der HashMap korrekt ist. Danke @Louis – Peter

4

Angenommen, ich Ihre Frage richtig gelesen habe (es gibt einige Unklarheiten über „mehrere Schlüssel“), was um Sie wollen selbst eine Klasse für den Schlüssel zu definieren, die mehrere Felder enthält und implementiert equals() und hashCode() in einer solchen Art und Weise, dass die Objekte können als HashMap Schlüssel verwendet werden.

Hier ist ein sehr einfaches Skelett-Implementierung (nicht getestet, einige Fehlerbehandlung weggelassen):

public class MyKey 
{ 
    private String part1 = null; 
    private Integer part2 = null; 
    public MyKey(String part1, int part2) 
    { 
     this.part1 = part1; 
     this.part2 = part2; 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     if (o == null || !(o instanceof MyKey)) return false; 
     return this.part1.equals(((MyKey)o).part1) && this.part2.equals(((MyKey)o).part2); 
    } 

    @Override 
    public int hashCode() 
    { 
     return this.part1.hashCode() + this.part2.hashCode(); 
    } 
} 
+0

Danke JIm. Was ich dachte, um eine Objektliste zu erstellen, in der die gesamte Tabelle in die Liste geladen wird. Erstellen Sie dann eine Getter-Methode, die FLD1 und FLD2 als Argumente akzeptiert und das Objekt zurückgibt, in dem FLD1 und FLD2 auf das Objekt in der Liste passen. Einfacher Iterator oder For-Schleife über die Liste. Aber ich bin mir nicht sicher, ob dies der richtige Weg ist. – Peter

+0

Jim, Wenn ich eine Klasse erstellen, die eine Abfrage für eine Datei ausführt und die Daten (alle Objekte) in eine Liste lädt. Die Klasse wird über eine Methode verfügen, die FLD1 und FLD2 als Argument akzeptiert und die übereinstimmende Entität (Objekt) zurückgibt. Auf diese Weise werden die Daten bei jedem Erstellen einer Instanz dieser Klasse in eine Liste geladen. Ich denke immer wieder über diese Liste nach, da ich damit vertraut bin. Ist das der richtige Weg, etwas anderes zu tun oder zu tun? Ich bin jsut neu zu Java, deshalb wollen Sie sicherstellen. Vielen Dank. Peter @JimGarrison – Peter

1

Eine Hashtable würde wahrscheinlich am besten funktionieren, um den Inhalt jeder Tabelle zu speichern. Eine Hashtabelle erlaubt es Ihnen grundsätzlich, beliebig viele Objekte hinzuzufügen, und jede hat einen eindeutigen Schlüssel.

Mein Vorschlag wäre, für jede Tabelle Datei zu tun. In meinem Beispiel gehe ich davon aus, dass Sie jede Zeile der Tabelle Datei in ein Objekt lesen Eintrag namens ...

// Create a new Hashtable, where the contents will be a String (the unique key) and an "Entry" object for the table row of data 
Hashtable<String,Entry> entriesTable = new Hashtable<String,Entry>(); 

for (each line in your table file){ 
    // Generate the unique value for this row. If there are multiple columns that make up the key, 
    // just join them together into a single String 
    String key = uniqueColumn1 + uniqueColumn2 + ...; 

    // Create an object for your row, if you dont have one already. 
    Entry row = new Entry(line); 

    // Add the entry to the Hashtable 
    entriesTable.put(key,row); 
    } 

Wenn Sie eine Zeile aus der Tabelle erhalten möchten, fragen Sie es durch seinen einzigartigen Wert ...

Entry entry = entriesTable.get(uniqueColumn1 + uniqueColumn2 + ...); 

Sie können so viele Objekte hinzufügen, wie Sie möchten, vorausgesetzt, sie haben jeweils einen eindeutigen Schlüssel. Die Hashtable unterstützt das Hinzufügen und Entfernen von Werten usw., so dass es ziemlich einfach ist, damit zu arbeiten.

Sie können auch eine Hashtable in ein Array konvertieren, wenn Sie möchten, und Sie können einen Enumerator erhalten, um über jeden Eintrag zu gehen, wenn Sie den gesamten Inhalt der Hashtable abrufen müssen.

+0

Danke, werde damit gehen. Im Grunde werde ich meine Tabelle von Mainframe über Abfrage lesen, eine Abfrageliste erstellen und dann von Querylist Hashtable für jede Entität erstellen. Danke noch einmal! – Peter

+0

Warum verwenden Sie möglicherweise eine 'Hashtable' anstelle von' HashMap' und 'Iterator'? Dies ist nicht Java 1.2. –

Verwandte Themen