Assoziatives Datenfeld - LinkFang.de





Assoziatives Datenfeld


Dieser Artikel oder Abschnitt ist nicht ausreichend belegt.

Das assoziative Datenfeld (englisch map, dictionary oder associative array) ist eine Datenstruktur, die – anders als ein gewöhnliches Feld (engl. array) – nichtnumerische (oder nicht fortlaufende) Schlüssel (zumeist Zeichenketten) verwendet, um die enthaltenen Elemente zu adressieren; diese sind in keiner festgelegten Reihenfolge abgespeichert. Idealerweise werden die Schlüssel so gewählt, dass eine für die Programmierer nachvollziehbare Verbindung zwischen Schlüssel und Datenwert besteht.

Mathematisch betrachtet wird durch die Wertezuordnungen im assoziativen Array eine Funktion mit endlicher Definitionsmenge beschrieben. Eine Implementierung ist mit Bäumen möglich, die bei weitem häufigste Umsetzung ist jedoch die Hashtabelle.

Programmiersprachen, die assoziative Felder unterstützen, sind zum Beispiel Lua, Perl, PHP, JavaScript, Python, Ruby, LISP, Tcl, awk, Smalltalk, C++, C#, Objective-C (als Klasse der Standardbibliothek), D, Java, Delphi (als Array-Property), PureBasic, PostScript, GNU Bourne-again shell (ab Version 4.0), PL/SQL und Visual Basic. Statt von einem assoziativen Array spricht man auch von einem Dictionary (Smalltalk, Python, Objective-C, PostScript, C#), einer Map (C++, Java, PureBasic), einem Hash (Perl, Ruby), einem Objekt (Javascript) oder einer Hashtable/Hashmap (Java, Windows PowerShell).

Beispiel

Die Ausgabe aller Beispiele ist „Mustermann“. Es handelt sich jeweils um das gleiche eindimensionale assoziative Feld, implementiert in verschiedenen Sprachen.

Ada

with Ada.Containers.Indefinite_Hashed_Maps,
     Ada.Strings.Hash,
     Ada.Text_IO;
procedure Hash_Map_Example is
  package String_String_Maps is new Ada.Containers.Indefinite_Hashed_Maps
    (Key_Type        => String,
     Element_Type    => String,
     Hash            => Ada.Strings.Hash,
     Equivalent_Keys => "=");
  use String_String_Maps;
  Person : String_String_Maps.Map;
begin
  Person.Insert ("Vorname"   , "Hans");
  Person.Insert ("Name"      , "Mustermann");
  Person.Insert ("Geburtstag", "01.01.01");
  Person.Insert ("Wohnort"   , "Musterstadt");
  Ada.Text_IO.Put_Line (Element (Person.Find ("Name")));
end Hash_Map_Example;

awk

person["Vorname"   ] = "Hans"
person["Name"      ] = "Mustermann"
person["Geburtstag"] = "01.01.01"
person["Wohnort"   ] = "Musterstadt"
print person["Name"]

Bash[1]

declare -A person=( ["Vorname"]="Hans" \
                    ["Name"]="Mustermann" \
                    ["Geburtstag"]="01.01.01" \
                    ["Wohnort"]="Musterstadt" )
echo "${person["Name"]}"

oder

declare -A person
person["Vorname"]="Hans"
person["Name"]="Mustermann"
person["Geburtstag"]="01.01.01"
person["Wohnort"]="Musterstadt"
echo "${person["Name"]}"

oder

declare -A person
person[Vorname]="Hans Peter"
person[Name]=Mustermann
person[Geburtstag]=01.01.01
person[Wohnort]=Musterstadt
echo ${person[Name]}

C#

var person = new System.Collections.Generic.Dictionary<string, string>();
person[ "Vorname"    ] = "Hans";
person[ "Name"       ] = "Mustermann";
person[ "Geburtstag" ] = "01.01.01";
person[ "Wohnort"    ] = "Musterstadt";
 
System.Console.WriteLine(person["Name"]);

C++

std::map<std::string, std::string> person;
 
person[ "Vorname"    ] = "Hans";
person[ "Name"       ] = "Mustermann";
person[ "Geburtstag" ] = "01.01.01";
person[ "Wohnort"    ] = "Musterstadt";
std::cout << person["Name"];

oder in C++11 mit Initialisierungslisten:

std::map<std::string, std::string> person {
   { "Vorname", "Hans" },
   { "Name",    "Mustermann" },
   { "Geburtstag", "01.01.01" },
   { "Wohnort" ,   "Musterstadt" } };
std::cout << person["Name"];

Common Lisp

(defparameter *person* (make-hash-table))
 
(setf (gethash 'vorname    *person*) "Hans")
(setf (gethash 'name       *person*) "Mustermann")
(setf (gethash 'geburtstag *person*) "01.01.01")
(setf (gethash 'wohnort    *person*) "Musterstadt")
 
(loop for key being the hash-keys in *person*
      using (hash-value val)
      do (format t "~10a => ~a~%" key val))

D

import std.stdio;
void main(string[] args) {
    string[string] person;
    person["Vorname"    ] = "Hans";
    person["Name"       ] = "Mustermann";
    person["Geburtstag" ] = "01.01.01";
    person["Wohnort"    ] = "Musterstadt";
    writeln(person["Name"]);
}

Go

var person = make(map[string]string)
person["Vorname"] = "Hans"
person["Name"] = "Mustermann"
person["Geburtstag"] = "01.01.01"
person["Wohnort"] = "Musterstadt"
println(person["Name"])

Haskell

import qualified Data.Map as M
-- ...
someAction :: IO ()
someAction = putStrLn $ person M.! "Name"
 where person = M.fromList [
        ("Vorname", "Hans"),
        ("Name", "Mustermann"),
        ("Geburtstag", "01.01.01"),
        ("Wohnort", "Musterstadt")
       ]

Java

import java.util.HashMap;
import java.util.Map;
// ...
Map<String, String> person = new HashMap<String, String>();
person.put("Vorname", "Hans");
person.put("Name", "Mustermann");
person.put("Geburtstag", "01.01.01");
person.put("Wohnort", "Musterstadt");
System.out.println(person.get("Name"));

JavaScript

var person = {
  Vorname:    'Hans',
  Name:       'Mustermann',
  Geburtstag: '01.01.01',
  Wohnort:    'Musterstadt'
};
alert(person.Name);

oder

var person = new Object();
person.Vorname = 'Hans';
person.Name = 'Mustermann';
person.Geburtstag = '01.01.01';
person.Wohnort = 'Musterstadt';
alert(person.Name);

oder

var person = new Object();
person['Vorname'] = 'Hans';
person['Name'] = 'Mustermann';
person['Geburtstag'] = '01.01.01';
person['Wohnort'] = 'Musterstadt';
alert(person['Name']);

Objective-C

NSMutableDictionary *person = [[NSMutableDictionary alloc] init];
[person setValue:@"Hans" forKey:@"Vorname"];
[person setValue:@"Mustermann" forKey:@"Nachname"];
[person setObject:@"01.01.01" forKey:@"Geburtstag"];
[person setObject:@"Musterstadt" forKey:@"Wohnort"];
NSLog(@"%@", [person valueForKey:@"Vorname"]);

oder mit Objective-C Literals

NSDictionary *person = @{ @"Vorname" : @"Hans",
                          @"Nachname" : @"Mustermann",
                          @"Geburtstag" : @"01.01.01",
                          @"Wohnort" : @"Musterstadt" };
 
NSLog(@"%@", person[@"Vorname"]);

Perl

my %person = ('Vorname'  => 'Hans',
            'Name'       => 'Mustermann',
            'Geburtstag' => '01.01.01',
            'Wohnort'    => 'Musterstadt');
print $person{'Name'};

oder

my %person;
$person{'Vorname'}    = 'Hans';
$person{'Name'}       = 'Mustermann';
$person{'Geburtstag'} = '01.01.01';
$person{'Wohnort'}    = 'Musterstadt';
print $person{'Name'};

PHP

$person = array ( 'Vorname'    => 'Hans',
                  'Name'       => 'Mustermann',
                  'Geburtstag' => '01.01.01',
                  'Wohnort'    => 'Musterstadt');
echo $person['Name'];

oder

$person = array();
$person['Vorname']    = 'Hans';
$person['Name']       = 'Mustermann';
$person['Geburtstag'] = '01.01.01';
$person['Wohnort']    = 'Musterstadt';
echo $person['Name'];

Alternative Syntax ab PHP 5.4:[2]

$person = ['Vorname'    => 'Hans',
           'Name'       => 'Mustermann',
           'Geburtstag' => '01.01.01',
           'Wohnort'    => 'Musterstadt'];
echo $person['Name'];

PL/SQL

DECLARE
  TYPE ty_person IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(50);
  person  ty_person;
BEGIN
  person('Vorname')    := 'Hans';
  person('Name')       := 'Mustermann';
  person('Geburtstag') := '01.01.01';
  person('Wohnort')    := 'Musterstadt';
  DBMS_OUTPUT.PUT_LINE(person('Name'));
END;

Python

person = { "Vorname"   : "Hans",
           "Name"      : "Mustermann",
           "Geburtstag": "01.01.01",
           "Wohnort"   : "Musterstadt" }
print (person["Name"])

oder

person = {}
person[ "Vorname"    ] = "Hans"
person[ "Name"       ] = "Mustermann"
person[ "Geburtstag" ] = "01.01.01"
person[ "Wohnort"    ] = "Musterstadt"
print (person["Name"])

Ruby

person = { :Vorname    => 'Hans',
           :Name       => 'Mustermann',
           :Geburtstag => '01.01.01',
           :Wohnort    => 'Musterstadt' }
puts person[:Name]

Ab Ruby 1.9:

person = { Vorname:    'Hans',
           Name:       'Mustermann',
           Geburtstag: '01.01.01',
           Wohnort:    'Musterstadt' }
puts person[:Name]

Tcl

set person(Vorname)    Hans
set person(Name)       Mustermann
set person(Geburtstag) 01.01.01
set person(Wohnort)    Musterstadt
puts $person(Name)

oder

array set person { Vorname    Hans
                   Name       Mustermann
                   Geburtstag 01.01.01
                   Wohnort    Musterstadt }
puts $person(Name)

Windows PowerShell

$person = @{ Vorname    = 'Hans';
             Name       = 'Mustermann';
             Geburtstag = '01.01.01';
             Wohnort    = 'Musterstadt' }
$person['Name']

Scala

val person = Map(
             "Vorname" -> "Hans",
             "Name" -> "Mustermann",
             "Geburtstag" -> "01.01.01",
             "Wohnort" -> "Musterstadt")
 
println(person("Name"))

Swift

Ungültige Sprache.

Die gewünschte Sprache muss wie folgt definiert werden: <source lang="html4strict">...</source>

Unterstützte Sprachen für die Syntaxhervorhebung:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


var variablePerson: [String:String] = [:]
variablePerson["Vorname"]  =  "Hans"
variablePerson["Name"] = "Mustermann"
variablePerson["Geburtstag"] = "01.01.01"
variablePerson["Wohnort"] = "Musterstadt"

let constPerson = [
                "Vorname" : "Hans",
                "Name" : "Mustermann",
                "Geburtstag" : "01.01.01",
                "Wohnort" : "Musterstadt"]

if let name = constPerson["Name"] {
    print(name)
}
Assoziative Datenfelder in Swift liefern ein Optional zurück.

XProfan

Ab Version X3 (2014)

declare hash person[]
 
person["Vorname"] = "Hans"
person["Name"] = "Mustermann"
person["Geburtstag"] = "01.01.01"
person["Wohnort"] = "Musterstadt"
person["Alter"] = 34
 
print person["Name"]

Literatur

  • Peter A. Henning, Holger Vogelsang (Hrsg.): Taschenbuch Programmiersprachen. 2. Auflage. Hanser, München 2007, ISBN 978-3-446-40744-2.

Einzelnachweise

  1. www.gnu.org
  2. wiki.php.net

Kategorien: Datenstruktur

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Assoziatives Datenfeld (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.