2013-02-22 12 views

Odpowiedz

41

Ponieważ jest to najprawdopodobniej zadanie uczenia , Dam ci wskazówkę: wszystkie punkty kodowe UNICODE dla liter alfabetu łacińskiego są uporządkowane alfabetycznie. Jeśli kod a to pewna liczba , to kod b to N+1, kod c to N+2, i tak dalej; kod Z to N+26.

Można odjąć punkty kodu znaku w ten sam sposób, w jaki odejmuje się liczby całkowite. Ponieważ punkty kodowe alfabetycznie następujące obliczenie

char ch = 'h'; 
int pos = ch - 'a' + 1; 

wytwarza liczbę sekwencji h, tj 8. Jeśli wykonasz to obliczenie w pętli, uzyskasz wynik, którego potrzebujesz.

Należy zauważyć, że powyższy wzór działa tylko ze znakami tego samego rejestru. Jeśli twój łańcuch wejściowy jest w mieszanym przypadku, przed wykonaniem obliczeń musisz przekonwertować każdy znak na małe litery, w przeciwnym razie wystąpiłby błąd.

+11

+1 za bycie jedyną odpowiedzią na próbę nauczania zamiast podawania kodu. – iamnotmaynard

1
String s = "hello world"; 
String t = ""; 
for (int i = 0; i < s.length(); ++i) { 
    char ch = s.charAt(i); 
    if (!t.isEmpty()) { 
     t += " "; 
    } 
    int n = (int)ch - (int)'a' + 1; 
    t += String.valueOf(n); 
} 
System.out.println(t); 

nie zajmować miejsca itp

0

można zrobić coś takiego:

for (int i = 0; i < a.length(); ++i) { 
    if (a.charAt(i) >= 'a' && a.charAt(i) <= 'z') { 
    System.out.println((int)a.charAt(i) - (int)'a'); 
    } 
} 
1
public static void main(String[] args) { 
    String s = "hello world"; 
    s = s.replace(" ", ""); 
    char[] c = s.toCharArray(); 

    for (Character ss : c) 
     System.out.println(ss - 'a' + 1); 
} 
1

Usa a Mapa z kluczem będącym znakiem i wartością będącą liczbą całkowitą. Nie jest to skuteczny sposób - mapa powinna być statycznym członkiem klasy.

import java.util.HashMap; 
import java.util.Map; 


public class JavaApplication1 
{ 
    public static void main(String[] args) 
    { 
     final Map<Character, Integer> map; 
     final String str = "hello world"; 

     map = new HashMap<>(); 
     // or map = new HashMap<Character, Integer> if you are using something before Java 7. 
     map.put('a', 1); 
     map.put('b', 2); 
     map.put('c', 3); 
     map.put('d', 4); 
     map.put('e', 5); 
     map.put('f', 6); 
     map.put('g', 7); 
     map.put('h', 8); 
     map.put('i', 9); 
     map.put('j', 10); 
     map.put('k', 11); 
     map.put('l', 12); 
     map.put('m', 13); 
     map.put('n', 14); 
     map.put('o', 15); 
     map.put('p', 16); 
     map.put('q', 17); 
     map.put('r', 18); 
     map.put('s', 19); 
     map.put('t', 20); 
     map.put('u', 21); 
     map.put('v', 22); 
     map.put('w', 23); 
     map.put('x', 24); 
     map.put('y', 25); 
     map.put('z', 26); 

     for(final char c : str.toCharArray()) 
     { 
      final Integer val; 

      val = map.get(c); 

      if(val == null) 
      { 
       // some sort of error 
      } 
      else 
      { 
       System.out.print(val + " "); 
      } 
     } 

     System.out.println(); 
    } 
} 
+0

+1 w celu uzyskania szczegółowego wyjaśnienia. BDW to pytanie zostało mi zadane w wywiadzie, na które odpowiedziałem przy użyciu tego samego podejścia. :) – amod

+0

Nie rozumiem, dlaczego zrobiłbyś to w ten sposób. "To nie jest skuteczny sposób" = istnieje lepszy sposób - co to jest? – Menasheh

+0

Jest to łatwy do zrozumienia sposób. Jeśli nie jest używany bardzo często, wydajność nie ma znaczenia. Celem nr 1 jest poprawienie, Cel nr 2 jest łatwy do zrozumienia/utrzymania, celem nr 3 jest szybkie działanie. Jeśli masz inne cele, prawdopodobnie zostaną wstawione między # 2 i # 3. Prędkość nie jest na ogół tak ważna, ponieważ możesz dowiedzieć się, gdzie twój kod jest wolny, a następnie zdecydować, jak najlepiej go przyspieszyć. – TofuBeer

1

dla każdego znaku w pozycji i: wyjście s.charAt (i) - "a" + 1. s jest ciągiem.

Powiązane problemy