2011-01-15 13 views
2

Ich habe Probleme herauszufinden, wie mein Code die Zeichenfolge, die von Benutzereingaben gegeben ist, zu erhöhen, so dass, wenn ein Benutzer einen Buchstaben wie z ersetzen möchte gehe zu a, b zu c usw. Der Haken ist, dass ich das tun muss, ohne boolean zu verwenden. Ich soll das bekommen, indem ich Arithmetik verwende, um die Beförderung von z zu a von den Benutzereingaben zu bekommen. Plus muss nur Kleinbuchstaben von a-z sein. Jede Hilfe wäre dankbar, danke.Förderung von Buchstaben in einer Zeichenfolge zum nächsten Buchstaben in Java

+0

Können Sie Vergleichsoperatoren verwenden (obwohl sie in gewissem Sinne boolesch sind)? –

+0

Müssen Sie nur Kleinbuchstaben und nur englisches Alphabet unterstützen? – birryree

+3

Schauen Sie in modulare Ergänzung (haben Sie nicht die Zeit, eine Antwort zu geben/zu testen). Es sollte Ihnen erlauben, die Schleife von 'z' -> 'a' zu bekommen. Konvertiere (lege) den Buchstaben in seinen Ascii-Code (int), subtrahiere bis auf den Bereich 1-26, führe eine modulare Addition durch (füge 1 Mod 26 hinzu), addiere den gleichen Betrag zurück, den du abgezogen hast, um den neuen ASCII-Code zu erhalten zurück zu einem Charakter. –

Antwort

2
String s = "q"; 
char c = s.charAt(0); 
c++; 
//here you can handle cases like z->a 
if (c=='z') c = 'a'; 

char[] chars = new char[1]; 
chars[0] = c; 
String s1 = new String(chars); 
+0

Könnte die Frage verletzen wegen "ich muss dies tun, ohne boolean zu verwenden", das keinen Vergleich/Gleichheit/Bedingungen implizieren kann. – birryree

+0

ok, das könnte folgendermaßen funktionieren: Map subs = new HashMap (); subs.put ('a', 'b'); ... –

+0

ich würde das 'C++' als 'else'-Bedingung setzen. andernfalls würde man mit "y" gefolgt von "a" kommen. – akf

1
Map<Character, Character> s = new HashMap<Character, Character>(); 
s.put('a', 'b'); 
... 
s.put('z', 'a'); 


String s = "q"; 
char c = s.charAt(0); 

c = s.get(c); 

char[] chars = new char[1]; 
chars[0] = c; 
String s1 = new String(chars) 

;

15

Dieses Stück Code

String foo = "abcdefz"; 
String bar = ""; 

for (char c : foo.toCharArray()) { 
    bar += Character.toString((char) (((c - 'a' + 1) % 26) + 'a')); 
} 

System.out.println(bar); 

ausgeben werden

bcdefga 

Was sie tut, ist das Zeichen nehmen, den Zeichencode für 'a' subtrahiert, so dass ein Wert von 0 bis 25 angegeben. Dann erhöhen wir 1. Nehmen wir diese Antwort und führen einen Modulus 26 durch. Wenn wir also 'z' haben, subtrahieren wir 'a' und ergeben 25 + 1 = 26, Modulus 26 = 0. Dann fügen wir 'a' hinzu und voilà!

** EDIT **

Sie können sogar das Konzept schieben ein wenig weiter und eine Variable hinzufügen "Verschiebung" Wert:

int shiftValue = 12; 

String foo = "abcdefz"; 
String bar = ""; 

for (char c : foo.toCharArray()) { 
    bar += Character.toString((char) (((c - 'a' + shiftValue) % 26) + 'a')); 
} 

System.out.println(bar); 

Will Ausgang

mnopqrl 

Die Der Wert shiftValue kann jede positive ganze Zahl sein (dh Verschiebung -2 ist die gleiche wie Verschiebung 24). Versuch es.

** UPDATE **

Nun, ersetzen Sie einfach Ihre alpha + 1 mit der Gleichung. Nicht, dass ich möchte Sie alles füttern, aber wenn Sie darauf bestehen müssen, hier ist das, was Sie tun müssen:

** HAFTUNGSAUSSCHLUSS **: enthält Ihre Hausaufgaben Lösung

// define some constants 
char FIRST_LETTER = 'a'; // the first letter in the alphabet 
int ALPHABET_SIZE = 26;  // the number of letters in the alphabet 
int SHIFT_VALUE = 1;  // number of letters to shift 

Scanner kb = new Scanner(System.in); 
String second = "hello world"; // target string 

String alphabet = kb.next(); 
// TODO: need to check if alphabet has at least one char and if it's in the range of a-z 
char alpha = alphabet.charAt(0); // just keep the first char in the input 
System.out.println(second.replace(alpha, (char) (((alpha - FIRST_LETTER + SHIFT_VALUE) % ALPHABET_SIZE) + FIRST_LETTER))); 

Will Ausgang

l 
hemmo wormd 

** EDIT 2 **

Wenn Sie eine indexbasierte alph (Für den Fall, dass Sie zusätzliche Zeichen usw. hinzufügen müssen), ist hier eine andere Lösung. Es gibt keinen Kommentar und keine Optimierung, aber der Code funktioniert und sollte selbsterklärend sein ... FYI nur:

int shiftValue = 1; 
char[] alphabet = new char[] { 
    'a','b','c','d','e','f','g','h','i', 
    'j','k','l','m','n','o','p','q','r', 
    's','t','u','v','w','x','y','z','!',' ' 
}; 
boolean[] replace = new boolean[alphabet.length]; 

Scanner kb = new Scanner(System.in); 
String text = "hello world !"; 

System.out.print("$ "); 
String input = kb.nextLine().toLowerCase(); 

Arrays.fill(replace, false); 
for (char c : input.toCharArray()) { 
    int index = -1; 
    for (int i=0; i<alphabet.length; i++) { 
     if (alphabet[i] == c) { 
     index = i; 
     break; 
     } 
    } 
    if (index >= 0) { 
     replace[index] = true; 
    } 
} 

for (int i=alphabet.length - 1; i>0; i--) { 
    if (replace[i]) { 
     text = text.replace(alphabet[i], alphabet[(i+shiftValue) % alphabet.length]); 
    } 
} 
System.out.println(text); 

Natürlich wird dieser Code ersetzen jeden von stdin im text String lesen char.Ein Beispiel für eine Ausgabe wäre:

$ ! e wo 
hfllpaxprlda 
+0

Also das Segment, mit dem ich bereits Probleme habe, ist: String alphabet = kb.next(); Zeichen alpha = alphabet.charAt (0); System.out.println (zweites replace (alpha, (char) ((int) alpha + 1))); Haben Sie Ideen, wie Sie diesen Codeabschnitt für die Operation ändern können? – CSD1988

+0

Ich hoffe wirklich, dass Sie immer noch da sind, weil ich versuche, dies für einen nicht verwandten Gebrauch von mir zu implementieren. Ich weiß jedoch nicht, welche Sprache das ist oder wie ich sie in meinen Codepen lege. – CelticTree

+0

@CelticTree hey! Nun, das ist in Java, aber fast jede Sprache kann ebenfalls verwendet werden, wie JavaScript (ich nehme an, seit Sie CodePen erwähnen). –

0

noch eine weitere Option, die == Test in einem Schalter versteckt:

public static void main(String[] args) 
{ 

    char[] chars = {'a','k','f','z'}; 
    for (char letter : chars) { 
     char next = letter; 
     switch (next) { 
     case 122: // or 'z', either way 
      next ='a'; 
      break; 
     default: 
      next += 1; 
     } 
     System.out.println(letter + " is followed by " + next + " "); 
    } 

} 
1

Ich habe folgende Antwort. Es kümmert sich um die weißen Zwischenräume zwischen Zeichenketten. Auch wenn Sie ein 'z' haben, welches das Ende des Alphabets ist, können Sie nicht zum nächsten Zeichen gehen, also habe ich es an den Anfang gesetzt, was ein a ist.

import java.util.Scanner; 

public class NextChar { 

    public static char nextCharacterInAlphabet(char character) 
    { 
     char nextChar;   
     int ascii = (int) character; 

     if (ascii ==32) //ascii code for a space is 32 
      /*space stays space that separates the different 
      strings seperated by the spaces */ 
      nextChar = (char) ascii; 
     else if (ascii == 122) 
      /*if the character is a z, then there is no 
      next character so i let i go back to the first character in alphabet*/ 
     nextChar = (char) (ascii -25); //alphabet has 26 chars, z=26 -25 is first char 
       else //if the char is not a space or z then it goes to the next char 
       nextChar = (char) (ascii +1); 
     return nextChar; 
    } 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     StringBuffer sb = new StringBuffer(); //to store the characters 

     for (char c : input.nextLine().toCharArray()) //loops through the char array 
     { 
      sb.append(nextCharacterInAlphabet(c)); //appends the chars to the stringbuffer passed to it by the method 
     } 
     System.out.println(sb.toString()) ; 
    } 
} 
Verwandte Themen