# Ersetzen von Buchstaben in einer readLine



## Schandro (28. Aug 2007)

Hallo,

ich bin noch gaanz am Anfang von Java und wollte folgendes "Programm", das man einfach nur in DOS ausführt, machen:

Der Benutzer gibt einen Namen ein, z.b. Hans Peter

das Programm ersetzt bei diesen Namen folgendes:
a, j, s, durch eine 1
b, k, t, durch eine 2
c, l, u, durch eine 3
d, m,v , durch eine 4
e, n, w, durch eine 5
f, o, x, durch eine 6
g, p, y, durch eine 7
h, q, z, durch eine 8
i, r, durch eine 9
Und gibt dadurch folgendes aus:

8151 75259

Ich hoffe ihr könnt mir helfen, ich habe nämlich keine Ahnung wie ich das machen könnte.


----------



## P3AC3MAK3R (28. Aug 2007)

String.replace sollte Dir weiterhelfen:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replace(char, char)


----------



## Schandro (28. Aug 2007)

Danke P3AC3MAK3R, das ist denke ich mal genau das was ich gesucht habe. Hab mal gleich versucht es zu benutzen, nur kommt bei dem folgenden Code diese Fehlermeldung:
------
r5.java:14: int cannot be dereferenced
a.replace('a'; '1');
 ^
1 Error



```
import java.io.*;

public class r5
{
public static void main(String[] args)
throws IOException
{
char a;
BufferedReader din = new BufferedReader(
new InputStreamReader(System.in));

System.out.println("Bitte Name eingeben: ");
a = Integer.parseInt(din.readLine());
a.replace('a', '1');
System.out.println(a);
}
}
```

Ich hab es erstmal nur mit einem ersetzen gemacht, der Rest kommt erst wenn das hier funktioniert. 

Ich hoffe mal bei der Replace-Funktion kann man auch Variablen verändern und nicht nur das, was man mit " " davor schreibt.


----------



## java666 (28. Aug 2007)

Hallo,

ich hab selber vor einiger Zeit so etwas in der richtung gemacht.


```
import java.util.*;

/**
 *
 * @author martin
 */
public class Codieren 
{
    public static void main(String [] args)
    {
        Scanner eingabe=new Scanner(System.in);        
        String name;
        
        name=eingabe.nextLine();
        
        name=name.replace('a', '1');
        name=name.replace('j', '1');
        name=name.replace('s', '1');        
        name=name.replace('A', '1');
        name=name.replace('J', '1');
        name=name.replace('S', '1');
        
        System.out.println(name);
        
    }
   
    
}
```

vielleicht hat noch jemand einen bessere lösung aber so würde es gehen ist aber viel tip arbeit!!


----------



## Schandro (28. Aug 2007)

Vielen Dank  java666
Hab gerade alles eingegeben, klappt super.

Ich hab noch eine Frage:

Könnte man aus dieser Zahlenfolge noch zusätzlich die Quersumme solange errechnen, bis diese Quersumme einstellig ist, und diese danach auch ausgeben?


----------



## java666 (28. Aug 2007)

Ich denk schon das es geht! Aber nur leider kann ich mit Quersumme nicht viel anfangen! Wenn du mir sagst wie des gerechnet wird kann bestimmt was draus machen

Des mit der Quersumme hab ich jetzt doch raus! Muss mal schauen ob da was geht! Bin selber noch blutiger anfänger!

Vom grund gedanken her ist es recht einfach aber leider für mich noch nicht so leicht:

Du musst den String zerlegen, und irgendwie kann man bestimmt auch sagen das er erst eine ausgabe machen darf wenn es nur noch 1stelle ist!

Aber leider muss da jetzt jemand anderes her der sich mit sowas auskennt oder eine kleine hilfe stellung gibt!


----------



## jPat (28. Aug 2007)

Quersummenfolgen braucht man nicht in einer schleife berechnen, da diese immer mit modulo 9 berechnet werden können  

123456 mod 9 = 3

Außnahme: xx mod 9 = 0 -> muß durch 9 ersetzt werden!

und natürlich einstellige zahlen....


----------



## jPat (28. Aug 2007)

Du soltest deine Methode, die Zeichen als zahlen darzustellen evtl mit replaceAll("a","1"); verfeinern, da ansonsten nur das erste vorkommen des Zeichens ersetzt wird.

zur Quersumme:

```
if (name.length()>1){
zahl = Integer.parseInt(name);
int qs = zahl%9;
if (qs==0) qs=9;
}
```

[edit] so, jetzt sollet es gehen. [/edit]


----------



## Schandro (28. Aug 2007)

Ich hab deinen Code dazugeschrieben, aber es kommen jetzt diese Fehler :



(Ich weiss leider nicht wie ich den aus DOS rauskopieren kann)

Es werden übrigens alle Zeichen ersetzt, nicht nur die jeweils ersten.   

Edit:

Ich hab den Code mal ein kleines bisschen umgeschrieben und jetzt sind es nurnoch 2 Fehler ^^

if (name.length>1){ 
int zahl = Integer.parseInt(name).intValue();
int qs = zahl%9; 
if (qs==0) qs=9;

hoffentlich hab ich nichts verschlimmbessert

Die beiden Sachen gehen aber immer noch nicht:

int cannot be dereferenced
int zahl = integer.parseInt(name).intValue();

cannot find symbol
symbol : variable length
location: class java.lang.String
if (name.length>1){


Nochmal Edit:

Bei 
if (name.length()>1){ 
hat nur das () gefehlt, d.h. als Error kommt beim complimieren nurnoch :

int cannot be dereferenced
int zahl = integer.parseInt(name).intValue();


----------



## Wildcard (28. Aug 2007)

Aus DOS zu kopieren dürfte tatsächlich schwierig werden, du hast nämlich kein DOS.
name.length()


----------



## jPat (29. Aug 2007)

sorry, 
int zahl =  Integer.parseInt(name);

zum Dos-Fenster, also cmd:

in der oberen Ecke findest du ein Menü, dort auf Bearbeiten->markieren, dann Bereich auswählen, dann wieder Bearbeiten->Kopieren ..... und paste


----------



## Saxony (29. Aug 2007)

Schandro hat gesagt.:
			
		

> [...](Ich weiss leider nicht wie ich den aus DOS rauskopieren kann)[...]



Hiho,

wenn du von der DOS-Konsole sprichst ist das recht einfach.

1. Rechtklick auf die Konsole und aus dem Popup markieren auswählen.
Schade das hier nicht Shift+F10 funktioniert, welches zum Beispiel beim Explorer die Tastenkombination für Rechtsklick ist. Fragt jetzt nicht wieviel Langeweile man haben muss um das raus zu finden. 
Aber bedient mal zwei Wochen Windows ohne Maus...

2. den Text markieren - Vorsicht der markiert nicht nach Textfluß sondern macht einfach ein Rectangle

3. rechtsklick auf den markierten Text oder enter - die Markierung verschwindet und man hat den so "umschlossenen" Text im clipboard.

bye Saxony


----------



## Schandro (29. Aug 2007)

Hallo,

Vielen Dank schonmal an alle, die mir bis jetzt geholfen haben   

Das Problem ist jetzt nurnoch das bei folgenden Code :


```
import java.util.*; 
public class z1
{ 
  public static void main(String [] args) 
  { 
Scanner eingabe=new Scanner(System.in);        
System.out.println("Bitte Name eingeben: ");
        String name; 
        name=eingabe.nextLine(); 
       
  name=name.replace('a', '1'); 
  name=name.replace('j', '1'); 
 usw. usw.usw.usw.usw.usw.usw.usw.usw.usw.usw.
  name=name.replace('r', '9'); 
  name=name.replace('I', '9');        
  name=name.replace('R', '9');   

           System.out.println(" ");    
        System.out.println(name); 

if (name.length()>1){ 
int zahl = Integer.parseInt(name).intValue();
int qs = zahl%9; 
if (qs==0) qs=9; 
} 
 }  
}
```

Dieses Problem kommt:

z1.java:68: int cannot be dereferenced
int zahl = Integer.parseInt(name).intValue();
.........................................^.........................
1 error

(Ach ist das schön das einfach rauszukopieren  ^^)

Hoffe ihr könnt mir da nochmals weiterhelfen.


----------



## java666 (29. Aug 2007)

Was genau soll es den jetzt machen dein Programm willst du ein Ausgabe von der Quersumme oder was willst du mit der Quersumme anstellen?


----------



## Schandro (29. Aug 2007)

Die Quersumme soll einfach nur ausgegeben werden (hab ich im Code vergessen)


----------



## java666 (29. Aug 2007)

so sieht des bei mir aus


```
name=name.replace('S', '1'); 
        
        if (name.length()>1)
        {
            long zahl = Long.parseLong(name);
            long qs = zahl%9;
            
            if (qs==0) qs=9; 
            {
                System.out.println(qs);
            }           
        }
    }        
}
```

Es funzt auch alles wunderbar (ich habe nur long genommen damit ich etwas testen konnte kannst gerne int bei dir lassen)


----------



## Leroy42 (29. Aug 2007)

Die statische Methode _parseInt_ der Klasse Integer liefert
dir doch schon ein int (Ein Blick in die API hätte genügt).
Also einfach

```
int zahl = Integer.parseInt(name);
```
schreiben.


----------



## Saxony (29. Aug 2007)

Hiho,

ich habe irgendwie noch nicht verstanden was das werden soll.

Man gibt einen Namen ein und die Buchstaben werden in Zahlen umgewandelt und daraus dann die Quersumme berechnet.

Tja und was sagt uns dann die Quersumme des Namen?

bye Saxony


----------



## Leroy42 (29. Aug 2007)

Saxony hat gesagt.:
			
		

> Tja und was sagt uns dann die Quersumme des Namen?



Nunja, das ist eine ganz raffitückische Verschlüsselung! 

Nur die _Ent_schlüsselung macht dann noch ein
paar kleinere Probleme...


----------



## Schandro (29. Aug 2007)

Das klappt zwar wunderbar, nur leider akzeptiert es dann keine Leerzeichen.
Fehler bei z.b. Hans Peter:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1
14 16"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
        at java.lang.Long.parseLong(Long.java:412)
        at java.lang.Long.parseLong(Long.java:461)
        at z16.main(z16.java:71)

Ist jetzt für mein Programm aber nicht schlimm, da der Benutzer eh nur einzelne Namen (also nicht Hans Peter auf einmal, sondern erst Hans und danach Peter) eingeben wir, da sonst die Quersumme der verschiedenen Namen zusammengerechnet werden würde.

Ich hab aber noch ein hoffentlich letztes Problem:
Das Programm soll solange laufen, bis der Benutzer "quit" anstatt eines Namen eingibt (Hoffe mal es gibt keinen Menschen mit Namen quit^^). Hab jetzt eine do-Schleife dazugeschrieben, und das Programm wiederholt sich jetzt auch. Aber die quit "Funktion" funktioniert nicht, d.h er behandelt quit wie einen normalen Namen anstattt es zu beenden. Die einzige Möglichkeit es zu beenden ist es, ein Name mit Leerzeichen in der mitte einzugeben (Was für eine Ironie!!). Hoffe ihr könnt mir (mal wieder) weiterhelfen:


```
import java.util.*; 
public class ne5
{ 
  public static void main(String [] args) 
  { 
Scanner eingabe=new Scanner(System.in); 
String beenden;
String quit;
quit = "quit";
do
{       System.out.println("Bitte Name eingeben: ");
        String name; 
        name=eingabe.nextLine(); 

beenden = name;

        
  name=name.replace('a', '1'); 
  name=name.replace('j', '1'); 
usw.
  name=name.replace('I', '9');        
  name=name.replace('R', '9');   

           System.out.println(" ");    
        System.out.println(name); 
long qs;
if (name.length()<2)
qs = 0;
else
{ 
long zahl = Long.parseLong(name);
qs = zahl%9; 
if (qs==0) qs=9; 
}
System.out.println("Quersumme: "+qs);
System.out.println(" ");
}while (beenden != quit);    
 }  
}
```
Es haben sich nur die Zeilen 7,8,9,10,11,15 und 37 geändert.

Das Programm selber ist  für die Namensnumerologie von Feng Shui gedacht.


----------



## Leroy42 (29. Aug 2007)

```
}while (!beenden.equals(quit));
```
Stringinhalte vergleicht man mit _equals_


----------



## Schandro (29. Aug 2007)

Juhuu    

Jetzt geht alles. Vielen Dank

Nur noch eine kleine letzte Frage:

Kann man in Windows ein Icon auf den Desktop oder sonstwo hin machen, dass die DOS-Eingabeaufforderung öffnet und das Java Programm startet? 
(Den Start von Java ohne DOS wüsste ich, nur funktioniert System.out.println dann leider nicht...)


----------



## merlin2 (29. Aug 2007)

Eine Verknüpfung anlegen, deren Pfad "java deinProgramm" o. ä. lautet?


----------



## Schandro (30. Aug 2007)

Das ist ja einfach. Danke


----------



## der JoJo (30. Aug 2007)

Hier stand mal was
#edit: wahr Blödsinn weil ich zu lange nicht aktualisiert hatte


----------



## Leroy42 (30. Aug 2007)

der JoJo hat gesagt.:
			
		

> Hier stand mal was
> #edit: wahr Blödsinn weil ich zu lange nicht aktualisiert hatte



Aha!

Und was sagt uns das jetzt?  :autsch: (  )


----------



## merlin2 (30. Aug 2007)

Dass er "war" falsch geschrieben hat.    :bae:


----------



## Saxony (30. Aug 2007)

Hmm aba eigentlich ist das gar nicht die Quersumme im eigentlichen Sinne.
Weil 99 hat als Quersumme 18 und nicht 99 % 9 = 0; qs = 9.
Das ist also die iterierte Quersumme.

bye Saxony


----------



## merlin2 (30. Aug 2007)

So ist es, aber dann hat man ja keine so schön kurze Schreibweise mehr. (  ) :wink:


----------

