Assoziatives Datenfeld

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Die fraglichen Angaben werden daher möglicherweise demnächst entfernt. Bitte hilf der Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst. Näheres ist eventuell auf der Diskussionsseite oder in der Versionsgeschichte angegeben. Bitte entferne zuletzt diese Warnmarkierung.

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[Bearbeiten | Quelltext bearbeiten]

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

Ada[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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

Bash[1][Bearbeiten | Quelltext bearbeiten]

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#[Bearbeiten | Quelltext bearbeiten]

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++[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

(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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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

Haskell[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

$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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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

Scala[Bearbeiten | Quelltext bearbeiten]

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

println(person("Name"))

Swift[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

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