___ answer3312808 ___

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.

    
___ answer3312826 ___

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.

    
___ answer3312832 ___

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.

    
___ answer3313703 ___

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.

    
___ qstntxt ___

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:

  1. Ändern Sie den Rückgabetyp in %code% Wrapper-Klasse und prüfen Sie auf %code%
  2. Geben Sie etwas sehr unwahrscheinlich zurück, z. B. %code%
  3. Erstellen Sie eine zusätzliche Funktion %code% , die immer zuerst aufgerufen werden sollte
  4. Wechseln Sie zu %code% und verwenden Sie stattdessen %code%

Ich schreibe dies in Java, aber Leute mit ähnlichen sprachlichen Hintergründen können gerne Beiträge schreiben. Danke!

    
___ answer3312837 ___

Option 5: Eine Ausnahme auslösen

In diesem Fall würde ich jedoch dafür stimmen, die Integer-Klasse zu verwenden.

    
___ answer3314439 ___

Zwei Situationen sind typisch:

  1. Sie haben eine hohe Erwartung von einen Wert für ein bestimmtes finden Schlüssel.
  2. Sie sind sich nicht sicher, ob es sich um einen bestimmten Schlüssel handelt hat einen Wert gespeichert.

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)

    
___ answer3312872 ___
  
  1. Ändern Sie den Rückgabetyp in die Integer-Wrapper-Klasse und prüfen Sie auf Null.
  2.   

Dies ist die häufigere Option.

    
___ answer3312849 ___

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.

    
___

7

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:

  1. Ändern Sie den Rückgabetyp in Integer Wrapper-Klasse und prüfen Sie auf null
  2. Geben Sie etwas sehr unwahrscheinlich zurück, z. B. Integer.MIN_VALUE
  3. Erstellen Sie eine zusätzliche Funktion boolean keyExists(String key) , die immer zuerst aufgerufen werden sollte
  4. Wechseln Sie zu 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!

    
idolize 22.07.2010, 19:44
quelle

8 Antworten

14

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.

    
Hut8 22.07.2010, 19:53
quelle
3

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.

    
Nathan Hughes 22.07.2010 19:52
quelle
1

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.

    
aperkins 22.07.2010 19:49
quelle
1

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.

    
Peter Lawrey 22.07.2010 21:34
quelle
1

Zwei Situationen sind typisch:

  1. Sie haben eine hohe Erwartung von einen Wert für ein bestimmtes finden Schlüssel.
  2. Sie sind sich nicht sicher, ob es sich um einen bestimmten Schlüssel handelt hat einen Wert gespeichert.

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)

    
Don Mackenzie 22.07.2010 23:57
quelle
0

Option 5: Eine Ausnahme auslösen

In diesem Fall würde ich jedoch dafür stimmen, die Integer-Klasse zu verwenden.

    
tylermac 22.07.2010 19:53
quelle
0

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.

    
Bill the Lizard 22.07.2010 19:55
quelle
0
  
  1. Ändern Sie den Rückgabetyp in die Integer-Wrapper-Klasse und prüfen Sie auf Null.
  2.   

Dies ist die häufigere Option.

    
Gilbert Le Blanc 22.07.2010 19:56
quelle

Tags und Links