Entry

Status
Nicht offen für weitere Antworten.

sowieso

Aktives Mitglied
Hi!

Ich habe folgende Funktion:

Code:
public static <K, V> Entry <K, V> getMapEntry(Set <Entry <K, V>> set, int index)
	{
		Iterator <Entry <K, V>> it = set.iterator();
		Entry <K, V> entry = null;
		for (int i = 0; i <= index; i++)
		{
			if (!it.hasNext())
			{
				return null;
			}
			entry = it.next();
		}
		return entry;
	}

Ich weiß, was ein "Map.Entry" ist. Was allerdings ein "Entry" ist weiß ich nicht. Ich kenne weder eine Klasse, noch eine Interfac namens "Entry".
Was ist denn das??
 

tfa

Top Contributor
Steht in der Datei zufällig
Code:
import java.util.Map.Entry;
?
Wenn ja, ist es ein Map.Entry.
 

sowieso

Aktives Mitglied
Ja, das steht da. Aber ist Entry wirklich genau dasselbe wie Map.Entry?

Dann verstehe ich nicht wieso das so ist. Es muss doch außerdem eine Klasse namens Entry geben oder eine Interface oder sowas ?!
 

tincup

Bekanntes Mitglied
Mit

Code:
import java.util.Map.Entry;

ist es ein Map.Entry

und das Interface gibts, ist ein inneres Interface (analog zu inneren Klassen) des Interfaces Map.
Siehe auch

http://java.sun.com/javase/6/docs/api/java/util/Map.Entry.html

Das verwirrende an solchen public inneren Klassen ist, dass man quasi die enthaltende Klasse ähnlich wie einen Pakennamen benutzt, z.B. eben bei java.util.Map.Entry. Aber so muss es halt gehen, wie auch sonst :wink:
 

sowieso

Aktives Mitglied
Achso verstehe.

Es heißt nicht this.Entry, weil es das Interface Entry nicht innerhalb der eigenen Klasse gibt, sondern eben innerhalb des Interfaces Map. Daher also Map.Entry. Da man die Klasse Map inklusive des inneren public Interface Entry ja aber importiert hat, kann man das Map. auch weglassen.

Hab ich das jetzt richtig kapiert?
 

sowieso

Aktives Mitglied
Sorry, aber jetzt hab ich doch nochmal eine Frage.

Das Interface Map hab ich importiert. Warum klappt denn das nicht:

Code:
Set <Entry<String, Integer>> set = new Set <Entry<String, Integer>>();
?
 
S

SlaterB

Gast
Set ist ein Interface, kann man nicht instanziieren

Code:
import java.util.HashSet;
import java.util.Set;
import java.util.Map.Entry;


public class Test
{

    public static void main(String[] args)
        throws Exception
    {

        Set<Entry<String, Integer>> set = new HashSet<Entry<String, Integer>>();
    }
}
 

sowieso

Aktives Mitglied
Ouch, danke ;) Das war wirklich eine blöde Frage.

Nur wie kann ich diesem HashSet bloß ein Map.Entry hinzufügen??

Code:
Set <Map.Entry <String, Integer>> tm = new HashSet <Map.Entry <String, Integer>>();
tm.add("1", 2);

So nicht, das ist klar, aber wie? Ich kann die Unterklasse Map.Entry ja nicht instantiieren..
 

sowieso

Aktives Mitglied
^^ stimmt, interessant. Aber vielleicht kannst du hellsehen?

Naja auf jedenfall hat die Klasse HashSet doch gar keine Methode put() ?!
 
S

SlaterB

Gast
warum willst du denn bloß selber Entries erstellen?
das wid alles sehr sehr grausig..

von HashMap kopiert und vereinfacht, ohne Garantie:

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Set<Entry<String, Integer>> set = new HashSet<Entry<String, Integer>>();
        Entry<String, Integer> k = new MyEntry<String, Integer>("x", 3);
        set.add(k);
        System.out.println(set.size());
    }

    static class MyEntry<K, V>
        implements Map.Entry<K, V>
    {
        final K key;
        V value;

        /**
         * Create new entry.
         */
        MyEntry(K k, V v)
        {
            value = v;
            key = k;
        }

        public K getKey()
        {
            return key;
        }

        public V getValue()
        {
            return value;
        }

        public V setValue(V newValue)
        {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }

        public boolean equals(Object o)
        {
            if (!(o instanceof Map.Entry)) return false;
            Map.Entry e = (Map.Entry)o;
            Object k1 = getKey();
            Object k2 = e.getKey();
            if (k1 == k2 || (k1 != null && k1.equals(k2)))
            {
                Object v1 = getValue();
                Object v2 = e.getValue();
                if (v1 == v2 || (v1 != null && v1.equals(v2))) return true;
            }
            return false;
        }

        public int hashCode()
        {
            return (key.hashCode()) ^ (value == null ? 0 : value.hashCode());
        }

        public String toString()
        {
            return getKey() + "=" + getValue();
        }

    }

}
 

ARadauer

Top Contributor
sorry
hab grad das

Code:
tm.add("1", 2);
angesehen.
bei einem hashset, ist das objekt selbst der key.

Warum bist du jetzt von Map auf Set gekommen?
Bleib doch bei Map.

hier gibts nochmal eine übersciht:
http://www.torsten-horn.de/techdocs/java-collections.htm

also Set: alle objekte kommen nur einmal vor
und Map: alle Schlüssel kommen nur einmal vor, objekte werden über schlüssel eingefügt und gesucht, objekte können doppelt vorkommen
 

sowieso

Aktives Mitglied
Also komisch aber das man Map.Entries nur durch so einen Zusatz erstellen kann.

Aber jetzt sind eigentlich alle meine Fragen geklärt!


Vielen Dank für eure riesen Mühe !
 
S

SlaterB

Gast
> komisch [..] Zusatz

so ist das bei ALLEN Interfacen vs implementierende Klassen,
hast du zuvor ja auch mit Set/ HashSet gesehen
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben