2016-12-11 6 views
2

Ich mache eine Art Chiffre in Java für Schulhausaufgaben. Die Aufgabe besteht darin, den Wert eines certian char in einen neuen Wert mit einem bestimmten Offset zu ändern, der vom Benutzer angegeben wird und einen Bereich von negativen Zahlen bis zu positiven Zahlen (Alphabet) aufweist.Negativer String-Index

Jetzt habe ich ein Problem mit negativen Offsets. Ich habe einen String mit dem Alphabet erstellt, der hilft, den neuen Charakter zu finden. Zum Beispiel: Mit dem Offset von 7 habe ich folgendes: encrypt(“TEST”) = “ALZA”. Also nimmt mein Code den Index des Zeichenfolgenwerts und sucht mit diesem Index in der alphabetischen Zeichenfolge nach dem neuen Zeichen. Wie auch immer, wenn ich jetzt das Zeichen 'E' und einen negativen Index haben, d. H. '-7' wird es den Wert -3 für den neuen Index des neuen Char (ich hoffe, dass das Sinn macht). Da es kein Zeichen auf Index '-3' gibt, erhalte ich einen Fehler.

Also wie kann ich auf das Ende der Zeichenfolge zugreifen, anstatt mehr und mehr in negative Indexnummern zu gehen?

Antwort

2

Ihr allgemeines Problem scheint zu sein, dass Buchstaben nur durch 26 Indizes dargestellt werden, aber die tatsächliche Indexvariable, die Sie verwenden, könnte größer als 26 oder sogar kleiner als Null (negativ) sein. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, den mod-Operator zu verwenden, um den Index sicher zu umschließen, sodass er immer auf einen Bereich zeigt, der einen gültigen Buchstaben enthält.

Hier Logik, die das tun können:

if (index < 0) { 
    index = (index % 26) + 26; 
} 
else { 
    index = index % 26; 
} 

Unter der Annahme, den Brief E ist Position 5 und Sie haben eine Neuzuordnung von -7, würde dies bedeuten, dass der neue Index -2 wäre. Diese neue Position kann wie folgt unter Verwendung der obigen Logik abgebildet werden, wobei index = -2 in diesem Fall:

5 - 7 = -2 
(-2 % 26) + 26 
-2 + 26 
24 

und Charakter in Position 24 ist der Brief X.

+0

Dies ist die Art, wie ich es gehandhabt habe, aber es ist etwas verpfuscht [link] (http://pastebin.com/imJAh3XR) in Zeile 12, ist das nicht das gleiche wie hast du beschrieben? – ethanqt

+0

@ethanqt Ich kann diese Frage nicht beantworten, ohne den vollständigen Code zu debuggen. –

+0

Das habe ich bis jetzt: [link] (http://pastebin.com/n1m1YUsw) – ethanqt

3

hinzufügen 26 dann mod 26:

i = (i + 26) % 26; 

Dies immer für Indizes bis -26 funktioniert. Wenn das nicht genug ist, fügen Sie einfach ein paar Nullen:

i = (i + 26000000) % 26; 
+0

'Das funktioniert immer' ... das geht nicht, wenn der negative Index weniger als -26 umschließt. –

+0

@tim antwort bearbeitet, nur für dich :) – Bohemian

0

Wenn Sie Verschiebungswerte einschränken können, positiv sein, können Sie Rest-Operator verwenden:

int newIndex = (Index + Shift)% 26

Wenn es Negativ zu erwarten:

int newIndex = Math.floorMod (inndex + shift, 26) Sie mathematische brauchen täte

dem Trick Eigentlich al modulo, aber% operator ist nicht ganz so