2010-11-24 12 views
9

Ich möchte die Buchstaben A zu Punkt 1 ändern und so der Buchstabe Z zu Nummer 26, dann wieder zu Nummer 27 Buchstaben AA, AB zu 28 geändert werden. Wie soll ich? Muss ich den "Schalter" benutzen? Ich benutze Java-Programm.Konvertieren von Buchstaben in Ziffern

+2

Zuerst müssen Sie definieren "change" . Dann müssen Sie uns sagen, was Sie versucht haben und was nicht funktioniert. Soll das für eine beliebige Länge funktionieren? – Falmarri

+0

Kannst du mir helfen, Snapshot Java hier einzubauen? – Leostrada

+0

Sie sollten in Betracht ziehen: http://StackOverflow.com/questions/763691/Programming-riddle-how-might-you-translate-an-excel-column-name-to-a-number, da diese Operation das Gegenteil ist . Eigentlich gewählt, um zu schließen - das ist genau die Hälfte des Problems gelöst. –

Antwort

9

Hat dies nicht testen, aber etwas in dieser Richtung sollte funktionieren:

public String numberToCharacterRepresentation(int number) { 
    char[] ls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 
    String r = ""; 
    while(true) { 
    r = ls[number % 26] + r; 
    if(number < 26) { 
     break; 
    } 
    number /= 26; 
    } 
    return r; 
} 

der Rückseite:

public int stringToNumber(String str) { 
    char[] ls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 
    Map<Character, Integer> m = new HashMap<Character, Integer>(); 
    int j = 0; 
    for(char c: ls) { 
    m.put(c, j++); 
    } 
    int i = 0; 
    int mul = 1; 
    for(char c: new StringBuffer(str).reverse().toString().toCharArray()) { 
    i += m.get(c) * mul; 
    mul *= ls.length; 
    } 
    return i; 
} 
+0

Wow danke: D. Aber wie konvertiert man einen nächsten Buchstaben Beispiel AA = 27, AB = 28, AC = 29, AD = 30? – Leostrada

+0

Wie mache ich einen Snapshot so? – Leostrada

+1

@ Jonathon Danke für die netten Bearbeitungen! @Leostrada stringToNumber sollte Ihnen das Gegenteil mitteilen. Sie sollten über Zahlenbasis-Conversions lesen, da dies im Grunde eine Konvertierung von Base-26 zu Base-10 ist. Hier ist ein Beispiel Link: http://www.cut-the-knot.org/recurrence/conversion.shtml –

0

Wie wäre es mit c-'A '+ 1 den Brief in c umwandeln zu der Nummer, die Sie wollen? Die Berechnung des nächsten Platzes wäre der gleiche wie der von 27. Im Grunde konvertieren Sie eine Basis-26-Nummer in einen Dezimalwert, außer dass Sie keine Null haben.

+0

c-A '+ 1 bedeutet, wenn ich AA schreibe dann wird in 27 konvertieren? – Leostrada

0

Dies wird die Aufgabe erledigen.

public String map(int i) { 
    String res = ""; 
    if (i <= 0) { 
     throw new IllegalArgumentException("Can only map +ve numbers"); 
    } 
    while (i > 0) { 
     res = Character.toString('A' + ((i - 1) % 26)) + res; 
     i = i/26; 
    } 
    return res; 
} 

Eine kompliziertere Version eineine StringBuilder mit einem effizient wäre, aber dies ist leichter zu verstehen.

+0

Wie mache ich einen Snapshot so? – Leostrada

+0

@Leostrada - Ich verstehe deine Frage nicht. –

+0

Er fragt, wie man Code auf SO formatiert. –

0

Vielleicht ist der einfachste Weg für A-Z wäre so etwas wie sein:

char c = *whatever letter you need*; 
int cAsInt = Integer.toString(c - '@'); // @ is 1 less than A 

Für Dinge wie AA, BB usw., wäre es davon ab, wie viele Kombinationen, die Sie benötigen. Das Einrichten eines Mappings kann am schnellsten sein, aber wenn die Möglichkeiten endlos sind, müssen Sie einige Formeln herausfinden.

1

Verwenden Sie den Objektcharakter 0 => 0 a => 10, usw. Wenn Sie Briefe nur dann 10

Character.forDigit(10,Character.MAX_RADIX) //will return 'a' 
Character.getNumericValue('a') // will return 10 
1

Eine einfache Lösung, das Problem zu behandeln, wie Buchstaben anstelle von Ziffern zu schreiben subtrahieren verwenden ist.

public static String asLetters(long num) { 
    StringBuilder sb = new StringBuilder(); 
    while(num > 0) { 
     sb.append((char) ('@' + num % 26)); 
     num /= 26; 
    } 
    return sb.toString(); 
} 
+0

aus Interesse, was ist die Bedeutung des @? – Toby

+0

''@'' ist ''A' - 1' –

0
import javax.swing.JOptionPane; 

public class TBesar{ 

    public static long x(int a, int b){ 
     if (b==0){ 
      return(1); 
     } 
     else{ 
      return(a*(x(a,(b-1)))); 
     } 
    } 
    public static long KatakeAngka(String nama){ 
     int A = 0; 
     int B = 26; 
     long C = 0; 
     long Z; 
     int panjang = nama.length(); 
     char namas[] = new char[panjang]; 
     for (int i=0;i<panjang;i++){ 
     namas[i] = nama.charAt(i); 
      switch (namas[i]){ 
       case 'a' : A=1;break; 
       case 'b' : A=2;break; 
       case 'c' : A=3;break; 
       case 'd' : A=4;break; 
       case 'e' : A=5;break; 
       case 'f' : A=6;break; 
       case 'g' : A=7;break; 
       case 'h' : A=8;break; 
       case 'i' : A=9;break; 
       case 'j' : A=10;break; 
       case 'k' : A=11;break; 
       case 'l' : A=12;break; 
       case 'm' : A=13;break; 
       case 'n' : A=14;break; 
       case 'o' : A=15;break; 
       case 'p' : A=16;break; 
       case 'q' : A=17;break; 
       case 'r' : A=18;break; 
       case 's' : A=19;break; 
       case 't' : A=20;break; 
       case 'u' : A=21;break; 
       case 'v' : A=22;break; 
       case 'x' : A=23;break; 
       case 'w' : A=24;break; 
       case 'y' : A=25;break; 
       case 'z' : A=26;break; 
      } 
      int D = panjang-(i+1); 
      Z = (x(B,D))*A; 
      C = C+Z; 
     }return(C); 
    } 
    public static String hitung(long angka){ 
     String B ; 
     if(angka<27){ 
      if(angka==1){ 
       B="a"; 
      }else if(angka==2){ 
       B="b"; 
      }else if(angka==3){ 
       B="c"; 
      }else if(angka==4){ 
       B="d"; 
      }else if(angka==5){ 
       B="e"; 
      }else if(angka==6){ 
       B="f"; 
      }else if(angka==7){ 
       B="g"; 
      }else if(angka==8){ 
       B="h"; 
      }else if(angka==9){ 
       B="i"; 
      }else if(angka==10){ 
       B="j"; 
      }else if(angka==11){ 
       B="k"; 
      }else if(angka==12){ 
       B="l"; 
      }else if(angka==13){ 
       B="m"; 
      }else if(angka==14){ 
       B="n"; 
      }else if(angka==15){ 
       B="o"; 
      }else if(angka==16){ 
       B="p"; 
      }else if(angka==17){ 
       B="q"; 
      }else if(angka==18){ 
       B="r"; 
      }else if(angka==19){ 
       B="s"; 
      }else if(angka==20){ 
       B="t"; 
      }else if(angka==21){ 
       B="u"; 
      }else if(angka==22){ 
       B="v"; 
      }else if(angka==23){ 
       B="w"; 
      }else if(angka==24){ 
       B="x"; 
      }else if(angka==25){ 
       B="y"; 
      }else{B="z";} 
      return(B); 
     } 
     else{ 
      return(hitung(angka/26)+hitung(angka%26)); 
     } 
    } 
    public static void main (String [] args){ 
     String kata = JOptionPane.showInputDialog(null,"Masukkan Kata ke 1"); 
     String kata2 = JOptionPane.showInputDialog(null, "Masukkan Kata ke 2"); 
     long hasil = KatakeAngka(kata); 
     long hasil2 = KatakeAngka(kata2); 
     long total = hasil+hasil2; 

     String HasilKata = hitung(total); 
     JOptionPane.showMessageDialog(null,kata+" = "+hasil+"\n"+kata2+" = "+hasil2+"\n"+kata+" + "+kata2+" = "+HasilKata); 
    } 
} 
1

Für die von Ihnen wollen dies für Excel tun:

public String getEquivColumn(int number){ 
    String converted = ""; 
    // Repeatedly divide the number by 26 and convert the 
    // remainder into the appropriate letter. 
    while (number >= 0) 
    { 
     int remainder = number % 26; 
     converted = (char)(remainder + 'A') + converted; 
     number = (number/26) - 1; 
    } 

    return converted; 
} 
0

Dies wird für A bis ZZ arbeiten:

public static int columnCharToNumber(String str) { 
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    if(str.length() == 1) { 
     return alphabet.indexOf(str); 
    } 
    if(str.length() == 2) { 
     return (alphabet.indexOf(str.substring(1)) + 26*(1+alphabet.indexOf(str.substring(0,1)))) ; 
    } 
    return -1; 
} 
+0

Hallo Arif, willkommen in SO und danke für Ihre Antwort. Um Ihre Antwort noch nützlicher zu machen, würde es Ihnen etwas ausmachen, sie zu editieren (Link unterhalb der Antwort bearbeiten), um eine Erklärung von _why_ hinzuzufügen, dieser Code löst das Problem? Es wird Menschen helfen, von anderen Situationen zu lernen und sie anzuwenden, anstatt nur das Copy-Paste-Coding zu fördern. Danke noch einmal! –

Verwandte Themen