Obwohl es stark von der Anwendung und den bekannten Einschränkungen abhängt, würde ich die obige Nummer 1 bevorzugen. Der Grund ist, weil es dann explizit ist - es ist immer besser, eine explizite Situation zu haben als eine implizite - wie MIN_VALUE - nach meiner Erfahrung.
Eine andere Option ist ein Wrapper-Objekt, das den Ergebniswert als primitiven int enthält, aber auch einen Statuswert oder etwas Ähnliches hat. So könnte es etwa so aussehen:
%Vor%Sie könnten auch eine Enum anstelle eines Boolean einfügen, um stattdessen einen Zustand zu haben, abhängig von der Komplexität des Problems. Wenn Sie sehen, dass dieses Element zusammengesetzte Informationen enthält - Informationsmengen, die aus einzelnen Schlüsseln oder ähnlichem bestehen - kann ein Containerobjekt oder Statusobjekt in diesen Fällen sehr nützlich sein.
Ich stimme dafür, hier eine geprüfte Ausnahme zu werfen. Im Allgemeinen mag ich keine geprüften Ausnahmen, aber es scheint in diesem Fall vernünftig zu sein. Der Fall, in dem der Wert nicht vorhanden ist, muss getrennt von dem Fall gehandhabt werden, in dem der Wert vorhanden ist. Eine Ausnahme würde dies verdeutlichen.
Eigentlich ist Ihre Idee, eine keyExists-Methode hinzuzufügen, die beste Idee, die Sie auflisten, weil sie nicht darauf angewiesen ist, dass der Benutzer weiß, nach einem bestimmten Wert zu suchen. Wenn Sie diesen Weg gehen, können Sie eine Ausnahme als Backup-Plan auslösen, falls sich der Karteninhalt zwischen dem Aufruf von keyExists und dem Abruf ändert.
Die erste Option ist meiner Meinung nach die sauberste. Magische Zahlen wie -1 und Integer.MIN_VALUE sind irgendwie unordentlich, besonders wenn die Werte nicht intuitiv sind. Das ist eine idiomatische C-Lösung, für die Java-Entwickler Sie hassen werden. Abhängig davon, was Sie tatsächlich verwenden, könnte dies auch eine "KeyNotFoundException" auslösen, wenn dies nur unter "außergewöhnlichen" Umständen geschieht.
float ist unsicher, da nicht alle int-Werte genau als int-Werte dargestellt werden können. long ist eine bessere Option, da alle int-Werte sicher so lange gespeichert werden können und Sie viele weitere Werte für nicht gefunden haben.
Wenn Sie eine Map verwenden, haben Sie sowieso ein Integer-Objekt, also geben Sie das (oder null) zurück
Wenn Sie wirklich Primitive (für Effizienz?) verwenden möchten, schlage ich vor, dass Sie sich TObjectIntHashMap stattdessen. Dies verwendet primitive int-Werte. Um auf Abwesenheit zu prüfen, müssen Sie den Schlüssel containsKey () separat überprüfen.
Ich habe eine Funktion, die einen %code% -Wert für einen bestimmten Schlüssel (von %code% ) zurückgibt. Wenn der Schlüssel nicht existiert, möchte ich etwas zurückgeben, nach dem der Anrufer suchen kann. Es scheint, dass dies am häufigsten eine " gibt -1 zurück, wenn der Schlüssel nicht existiert " Art der Sache. Jedoch kann ich in diesem Fall -1 nicht für diesen Zweck reservieren, da negative Zahlen brauchbare Werte für Schlüssel sind, die tun existieren.
Die einzigen anderen Optionen, auf die ich gekommen bin, sind die folgenden:
Ich schreibe dies in Java, aber Leute mit ähnlichen sprachlichen Hintergründen können gerne Beiträge schreiben. Danke!
Option 5: Eine Ausnahme auslösen
In diesem Fall würde ich jedoch dafür stimmen, die Integer-Klasse zu verwenden.
Zwei Situationen sind typisch:
Wenn Annahme 1 falsch ist, dann wird wahrscheinlich ein Fehler angezeigt. Schützen Sie daher Ihre Annahme in der Zugriffsmethode mit einer Assertion.
Wenn 2 zutrifft, wie würden Sie sicher sein, was zurückgegeben wurde? Also stellen Sie eine Testmethode wie "keyExists" bereit und kennen Sie absolut, bevor Sie auf die Karte zugreifen.
In Fall 1 ist keine Überprüfung erforderlich, was viel sauberer ist, aber der Zugriff scheitert, wenn Sie falsch liegen. Bei speziellen Fällen wie -1 oder Integer.MIN_VALUE ist es sehr schwer sicher zu sein, dass sie nicht verwendet werden.
Sprachen wie Haskell, Scala und C # haben spezielle Typen, um die Anwesenheit / Abwesenheit eines Wertes zu vermitteln, der weit besser ist als der Gebrauch von Null (wenn Sie vergessen haben, werden Sie wahrscheinlich eine NullPointerException erhalten)
- Ändern Sie den Rückgabetyp in die Integer-Wrapper-Klasse und prüfen Sie auf Null.
Dies ist die häufigere Option.
Ich denke, Sie sollten die Optionen # 1 und # 3 kombinieren, da dies mit dem Verhalten der zugrunde liegenden HashMap übereinstimmt. Aus HashMap's Methodendokumentation erhalten :
Gibt den Wert zurück, dem der angegebene Schlüssel in dieser Identitätshashzuordnung zugeordnet wurde, oder null, wenn die Zuordnung keine Zuordnung für diesen Schlüssel enthält. Ein Rückgabewert von null gibt nicht unbedingt an, dass die Zuordnung keine Zuordnung für den Schlüssel enthält. Es ist auch möglich, dass die Karte den Schlüssel explizit auf Null abbildet. Die Methode containsKey kann verwendet werden, um diese beiden Fälle zu unterscheiden.
Ich habe eine Funktion, die einen int
-Wert für einen bestimmten Schlüssel (von HashMap<String, Integer>
) zurückgibt. Wenn der Schlüssel nicht existiert, möchte ich etwas zurückgeben, nach dem der Anrufer suchen kann. Es scheint, dass dies am häufigsten eine " gibt -1 zurück, wenn der Schlüssel nicht existiert " Art der Sache. Jedoch kann ich in diesem Fall -1 nicht für diesen Zweck reservieren, da negative Zahlen brauchbare Werte für Schlüssel sind, die tun existieren.
Die einzigen anderen Optionen, auf die ich gekommen bin, sind die folgenden:
Integer
Wrapper-Klasse und prüfen Sie auf null
Integer.MIN_VALUE
boolean keyExists(String key)
, die immer zuerst aufgerufen werden sollte float
und verwenden Sie stattdessen NaN
Ich schreibe dies in Java, aber Leute mit ähnlichen sprachlichen Hintergründen können gerne Beiträge schreiben. Danke!
Die erste Option ist meiner Meinung nach die sauberste. Magische Zahlen wie -1 und Integer.MIN_VALUE sind irgendwie unordentlich, besonders wenn die Werte nicht intuitiv sind. Das ist eine idiomatische C-Lösung, für die Java-Entwickler Sie hassen werden. Abhängig davon, was Sie tatsächlich verwenden, könnte dies auch eine "KeyNotFoundException" auslösen, wenn dies nur unter "außergewöhnlichen" Umständen geschieht.
Ich stimme dafür, hier eine geprüfte Ausnahme zu werfen. Im Allgemeinen mag ich keine geprüften Ausnahmen, aber es scheint in diesem Fall vernünftig zu sein. Der Fall, in dem der Wert nicht vorhanden ist, muss getrennt von dem Fall gehandhabt werden, in dem der Wert vorhanden ist. Eine Ausnahme würde dies verdeutlichen.
Eigentlich ist Ihre Idee, eine keyExists-Methode hinzuzufügen, die beste Idee, die Sie auflisten, weil sie nicht darauf angewiesen ist, dass der Benutzer weiß, nach einem bestimmten Wert zu suchen. Wenn Sie diesen Weg gehen, können Sie eine Ausnahme als Backup-Plan auslösen, falls sich der Karteninhalt zwischen dem Aufruf von keyExists und dem Abruf ändert.
Obwohl es stark von der Anwendung und den bekannten Einschränkungen abhängt, würde ich die obige Nummer 1 bevorzugen. Der Grund ist, weil es dann explizit ist - es ist immer besser, eine explizite Situation zu haben als eine implizite - wie MIN_VALUE - nach meiner Erfahrung.
Eine andere Option ist ein Wrapper-Objekt, das den Ergebniswert als primitiven int enthält, aber auch einen Statuswert oder etwas Ähnliches hat. So könnte es etwa so aussehen:
%Vor%Sie könnten auch eine Enum anstelle eines Boolean einfügen, um stattdessen einen Zustand zu haben, abhängig von der Komplexität des Problems. Wenn Sie sehen, dass dieses Element zusammengesetzte Informationen enthält - Informationsmengen, die aus einzelnen Schlüsseln oder ähnlichem bestehen - kann ein Containerobjekt oder Statusobjekt in diesen Fällen sehr nützlich sein.
float ist unsicher, da nicht alle int-Werte genau als int-Werte dargestellt werden können. long ist eine bessere Option, da alle int-Werte sicher so lange gespeichert werden können und Sie viele weitere Werte für nicht gefunden haben.
Wenn Sie eine Map verwenden, haben Sie sowieso ein Integer-Objekt, also geben Sie das (oder null) zurück
Wenn Sie wirklich Primitive (für Effizienz?) verwenden möchten, schlage ich vor, dass Sie sich TObjectIntHashMap stattdessen. Dies verwendet primitive int-Werte. Um auf Abwesenheit zu prüfen, müssen Sie den Schlüssel containsKey () separat überprüfen.
Zwei Situationen sind typisch:
Wenn Annahme 1 falsch ist, dann wird wahrscheinlich ein Fehler angezeigt. Schützen Sie daher Ihre Annahme in der Zugriffsmethode mit einer Assertion.
Wenn 2 zutrifft, wie würden Sie sicher sein, was zurückgegeben wurde? Also stellen Sie eine Testmethode wie "keyExists" bereit und kennen Sie absolut, bevor Sie auf die Karte zugreifen.
In Fall 1 ist keine Überprüfung erforderlich, was viel sauberer ist, aber der Zugriff scheitert, wenn Sie falsch liegen. Bei speziellen Fällen wie -1 oder Integer.MIN_VALUE ist es sehr schwer sicher zu sein, dass sie nicht verwendet werden.
Sprachen wie Haskell, Scala und C # haben spezielle Typen, um die Anwesenheit / Abwesenheit eines Wertes zu vermitteln, der weit besser ist als der Gebrauch von Null (wenn Sie vergessen haben, werden Sie wahrscheinlich eine NullPointerException erhalten)
Ich denke, Sie sollten die Optionen # 1 und # 3 kombinieren, da dies mit dem Verhalten der zugrunde liegenden HashMap übereinstimmt. Aus HashMap's Methodendokumentation erhalten :
Gibt den Wert zurück, dem der angegebene Schlüssel in dieser Identitätshashzuordnung zugeordnet wurde, oder null, wenn die Zuordnung keine Zuordnung für diesen Schlüssel enthält. Ein Rückgabewert von null gibt nicht unbedingt an, dass die Zuordnung keine Zuordnung für den Schlüssel enthält. Es ist auch möglich, dass die Karte den Schlüssel explizit auf Null abbildet. Die Methode containsKey kann verwendet werden, um diese beiden Fälle zu unterscheiden.
- Ändern Sie den Rückgabetyp in die Integer-Wrapper-Klasse und prüfen Sie auf Null.
Dies ist die häufigere Option.
Tags und Links java