EditText gleichzeitig mehrere Buchstaben vergleichen?

  • Antworten:16
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 1.525

04.10.2013 22:44:26 via App

Hallo liebes Forum.

Ich habe echt nichts bei Google gefunden.
Oder weiss erst gar nicht ob so was überhaupt geht.

Beispiel was ich meine:

1if(eingabe.equalsIgnoreCase("a")){
2
3 editText.setText("TestEins");
4
5 } if(eingabe.equalsIgnoreCase("b")){
6
7 editText.setText("TestZwei");
8
9}

Was ich also möchte ist, wenn ich z.B a und b eingebe das er dann beide Texte setzt.
Also beide Buchstaben einzeln vergleicht.
Nur wie setzt man das um?
Weil wenn ich ja "ab" schreibe passiert ja nichts. Nur bei "a" alleine oder "b" alleine.


LG

— geändert am 04.10.2013 23:04:55

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.215

04.10.2013 22:54:17 via Website

Meinst du so etwas?
1String eingebe= getEditText...;
2
3
4if(eingabe.equals("a"))
5{
6//das was bei case a passieren soll
7}
8else if(eingabe.equals(b))
9{
10//was bei b passieren soll
11}
12
13else{
14//was bei falscher eingabe passieren soll
15}

Ist das so wie du es wolltest?

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 159

04.10.2013 22:55:52 via Website

Wenn ich dich richtig verstanden habe,
dann hast du einen Listener auf den Tastendruck gesetzt
und willst einfach nur einen Text hinzufügen anstelle eines Buchstabens richtig?
Wenn ja, ganz einfach.

1String strTextToAdd = "";
2if(eingabe.equalsIgnoreCase("a"))
3 strTextToAdd = "TestEins";
4else if(eingabe.equalsIgnoreCase("b"))
5 strTextToAdd = "TestZwei";
6
7String strTmp = editText.getText().toString();
8editText.setText(strTmp.substring(0, strTmp.length()-1) + strTextToAdd);

MfG. Nico

Meine Apps

  • Forum-Beiträge: 1.525

04.10.2013 23:02:35 via Website

@Pascal P.

Ähh das gleiche was du geschrieben hast ist genau das gleiche wie meins.
Nur das du "else if" hast anstatt beide "if".

Nico was ich meine ist:

Gebe ich "a" ein und drücke den Button bekomme ich doch den Text von hier:

1if(eingabe.equalsIgnoreCase("a")){
2
3 editText.setText("TestEins");
4
5}

Gebe ich "b" ein bekomme ich den Text von von hier:

1if(eingabe.equalsIgnoreCase("b")){
2
3editText.setText("TestZwei");
4
5}

Gebe ich dann "ab" ein dann passiert doch nichts oder?
Ich möchte aber das wenn ich "ab" eingeben das er beide einzelnt vergleicht und ich dann beide Texte von "a" und "b" bekomme:

1TestEinsTestZwei
So würde das dann aussehen.


LG
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.215

04.10.2013 23:09:45 via Website

Dann musst du dei Texte mit Contains vergleichen etwa so:
1if(eingabe.contains(ab)) // prüfe ob die buchstaben irgendwo im string vorkommen
2{
3if(eingabe.substring(0,1).equals(a)
4{
5edittext.setText("Test1");
6}
7if(eingabe.substring(1,2))
8{
9edittext.setText("Test2");
10}
11
12}
So müsste es dann gehen

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 159

04.10.2013 23:35:53 via Website

Naja alternative Lösungswege:
1String str = editText.getText().toString();
2
3if(Pattern.matches( "[a-b]", strEingabe ))//Eigentlich unnötig, du kannst auch einfach str.replaceAll machen
4{
5 str = str.replaceAll("a", "TestEins");
6 str = str.replaceAll("b", "TestZwei");
7}
8
9editText.setText(str);


Lösungsweg 2, falls du komplexeres vor hast.
1String str = editText.getText().toString();
2Pattern p = Pattern.compile("[a-b]{1}");//Buchstaben a bis b
3Matcher m = p.matcher(str);
4while(m.find())
5{
6 String strToken = m.group(1);//strToken = "a" oder "b"
7
8 String strNew = MachWasDamit(strToken);
9
10 str = str.replace(strToken, strNew);
11}
12
13editText.setText(str);
14
15//...
16int nCount = 0;
17String MachWasDamit(String str)
18{
19 return str.equalsIgnoreCase("a") ? "TextEins" + String.valueOf(nCount++) : "TextZwei" + String.valueOf(nCount--);
20}

— geändert am 04.10.2013 23:37:54

MfG. Nico

Meine Apps

  • Forum-Beiträge: 2.545

05.10.2013 00:53:11 via Website

@Pascal:
...und wenn er "ba" eingibt?
Willst du auch bei zB 10 Buchstaben alle Kombinationen mit jeweils einem if() berücksichtigen?

@Nico:
die .replace Methode wird scheitern, sobald in einem der "Test" Strings eines der Trigger-Zeichen enthalten ist :-P

wie ich es verstanden habe wäre das Konzept etwa so:
1String src = eingabe;
2String dst = "";
3int i, l = src.length();
4for (i=0; i<l; i++) {
5switch (src.charAt(i)) {
6case 'a': dst += "Test1"; break;
7case 'b': dst += "Test2"; break;
8...
9}
10}
11editText.setText(dst);
So bleibt die Reihenfolge erhalten, der Code leserlich und die ersetzten Zeichen produzieren keine Seiteneffekte.
  • Forum-Beiträge: 1.525

05.10.2013 06:59:18 via Website

Hallo alle zusammen.

Ich danke euch allen.

Bestes Konzept von @and dev.
Funktioniert wunderbar. Ich danke dir sehr.:D
Hatte auch schon was mit switch und case versucht.
Aber bei mir klappte es nicht.

Nun ja. Vielen dank dir nochmal.



LG

— geändert am 05.10.2013 07:00:33

  • Forum-Beiträge: 159

05.10.2013 09:04:07 via App

@and dev Nö das funktioniert super, wenn man sich etwas mit RegEx beschäftigt.
Und den Pattern anpasst.
Hinzu ist RegEx meines Wissens auch schneller als dein Code, der den gesamten String durchläuft. =P
(so habe ich es gelesen)

Außerdem wird bei deinem Code jede andere Eingabe verworfen..

— geändert am 05.10.2013 09:10:30

MfG. Nico

Meine Apps

  • Forum-Beiträge: 2.545

05.10.2013 11:13:21 via Website

@Michele:
Immer gerne :)

@Nico:
Nö das funktioniert super
Ah, eine Sequenz:

str = "a";
str = str.replaceAll("a", "b");
str = str.replaceAll("b", "x");

würde also kein "x" in der Ausgabe erzeugen?


Außerdem wird bei deinem Code jede andere Eingabe verworfen..

Ja genau, gemäß Micheles erstem Post scheint das ja auch die Vorgabe zu sein :)
  • Forum-Beiträge: 159

05.10.2013 12:27:37 via Website

@and dev
Ich sagte WENN man RegEx ANPASST.
(Genauer lesen..)
Ansonsten habe ich es so verstanden, das bei einer Eingabe von "a" / "b" ein Text eingefügt werden soll anstelle des Buchstabens.
Und die Eingabe ansonsten normal sein soll.
Falls es wie von dir gewünscht dargestellt ist, habe ich seinen Wunsch falsch verstanden.

Edit: Da das wohl sonst so weiter geht hier der Code....

1Pattern p = Pattern.compile("(a|b)");
2Matcher m = p.matcher(str);
3StringBuffer sb = new StringBuffer();
4while(m.find())
5{
6 String strToken = m.group(1);
7 m.appendReplacement(sb, MachWasDamit(strToken));
8}
9editText.setText(sb.toString());
10
11
12//.....
13//.....
14//.....
15
16int nCount = 0;
17String MachWasDamit(String str)
18{
19 return str.equalsIgnoreCase("a") ? "TextEins" + String.valueOf(nCount++) : "TextZwei" + String.valueOf(nCount--);
20}

— geändert am 05.10.2013 13:10:48

MfG. Nico

Meine Apps

  • Forum-Beiträge: 1.525

06.10.2013 02:10:19 via Website

Hallo liebes Forum.

Wie ich merkte Funktioniert das leider anders rum wohl nicht so leicht?

Also wenn ich dann später z.B den Text "Test1" vergleiche und dann das "a" haben möchte.
Weil mir wird gesagt im Android Studio:
1incompatible types. Found: 'java.lang.String', required: 'byte,char,short or int'
Sieht also wohl schlecht aus im switch einen String zu vergleichen?

Oder stell ich mich wieder so doof an :*)??


LG

— geändert am 06.10.2013 07:59:33

  • Forum-Beiträge: 2.545

06.10.2013 11:32:11 via Website

Wie ich merkte Funktioniert das leider anders rum wohl nicht so leicht?

Du könntest dir die "Test..." Strings zB in einem Arry sammeln und den gefundenen Index (startsWith()) als Parameter für switch() verwenden;

Ich würde allerdings in diesem Fall beide Wertemengen in jeweils einem Array sammeln und dann eine allgemeine Funktion convert(src, dest) verwenden, um beide Konvertierungen durchzuführen, also
convert(abArray, testArray); // Anfrage letzte Tage
convert(testArray, abArray) // neue Anfrage
  • Forum-Beiträge: 1.525

06.10.2013 17:26:38 via Website

and dev
Wie ich merkte Funktioniert das leider anders rum wohl nicht so leicht?

Du könntest dir die "Test..." Strings zB in einem Arry sammeln und den gefundenen Index (startsWith()) als Parameter für switch() verwenden;

Ich würde allerdings in diesem Fall beide Wertemengen in jeweils einem Array sammeln und dann eine allgemeine Funktion convert(src, dest) verwenden, um beide Konvertierungen durchzuführen, also
convert(abArray, testArray); // Anfrage letzte Tage
convert(testArray, abArray) // neue Anfrage

Hallo.

Danke dir nochmal.
Werde das mal versuchen.:D


LG