Avatar billede Slettet bruger
16. april 2002 - 08:57 Der er 28 kommentarer og
1 løsning

Java. Afvisning af karakterer

Hej.
Er der en klasse, eller hvordan laver man en som siger:

Der skal være én eller mange af "a"
Der skal være én eller mange af "b"
osv.

Således man kan fastlægge hvilke tegn der må indtastes/eller læses i en tekststreng og at kun disse repræsenteres.

willi

Avatar billede quaid Nybegynder
16. april 2002 - 09:03 #1
Brug charAt() til at chekke dine tegn. Den smider ascii værdien retur, og så kan teste på den.
QD::
Avatar billede quaid Nybegynder
16. april 2002 - 09:05 #2
Undskyld! så kan du teste på den værdi.
QD::
Avatar billede Slettet bruger
16. april 2002 - 09:11 #3
Det forekommer lidt omstændigt. Men jeg ser lige pået.
Avatar billede disky Nybegynder
16. april 2002 - 09:16 #4
Denne her skulle kunne gøre det.

public boolen checkChar(String input, char ch)
{
boolean result=false;
if(input.index(ch)!=-1)
{
  result=true;
}
return result;
}
Avatar billede disky Nybegynder
16. april 2002 - 09:16 #5
arg en lille fejl:
Denne her skulle kunne gøre det.

public boolen checkChar(String input, char ch)
{
boolean result=false;
if(input.indexOf(ch)!=-1)
{
  result=true;
}
return result;
}
Avatar billede disky Nybegynder
16. april 2002 - 09:18 #6
hold da ferie det går godt idag :(

ret public boolen til:
public boolean
Avatar billede quaid Nybegynder
16. april 2002 - 09:24 #7
Eller dette gamle kode fra noget jeg kogte sammen for længe siden.

int xa3 = 0;
            String testDiff2 = lU.getText();
            for (int i = 0; i < testDiff2.length() ; i++)
            {             
              xa3 = testDiff2.charAt(i);   
              System.out.println(xa3);         
              if (xa3 < 48 || xa3 > 57)
             
                {
                JOptionPane.showMessageDialog(content, "Invalid caracter. Only use Integers", "Error", JOptionPane.ERROR_MESSAGE);
              return;
                }
            }

testDiff er den string man ønsker at teste på. Så løber løkken den igennem og ser om værdien ligger indenfor tallene 0 - 9 (så vidt jeg husker)
QD::
Avatar billede Slettet bruger
16. april 2002 - 09:28 #8
Jeg gør hvad jeg kan for at følge med  ;-)
Avatar billede Slettet bruger
16. april 2002 - 09:43 #9
Den sidste kan jeg ikke få til at virke.
Og hvis jeg ellers er nået langt nok ser det ud som om at Disky's fungere således at hvis jeg har tastet nogle godkendte tegn ind kan jeg også indtaste ikke godkendte.
Dvs hvis
string = "a";
string "OK";

så er

string = "a,";
eller
string = "a>";

også ok

og den går jo ikke. Men måske er fejlen hos mig.
Avatar billede quaid Nybegynder
16. april 2002 - 09:56 #10
Prøv at kør dette quick and dirty kode. Det skulle give en fornemmelse for hvad der sker.

import java.io.*;


public class Indlaes
{
    public static void main (String[] args) throws IOException
    {   
       
        System.out.println ("Indtast nogle chars og tryk enter");
        InputStreamReader isr = new InputStreamReader (System.in);
        BufferedReader mitobject = new BufferedReader (isr);       
       
       
            int xa3 = 0;
            String testDiff2 = mitobject.readLine();
            for (int i = 0; i < testDiff2.length() ; i++)
            {             
              xa3 = testDiff2.charAt(i);   
             
              if (xa3 < 48 || xa3 > 57)
             
                {
                System.out.println ("Det indtastede  " + (testDiff2.charAt(i)) + "  er ikke mellem 0 og 9");
               
                }
            }       
       
    }
}


QD::
PS jeg må tilstå at Diskys kode eksempel er noget pænere :)
Avatar billede disky Nybegynder
16. april 2002 - 09:58 #11
willi:

Hvis du også vil kunne kigge på strenge så ret til:

public boolean checkChar(String input, String ch)
{
boolean result=false;
if(input.indexOf(ch)!=-1)
{
  result=true;
}
return result;
}


Så virker den stadigvæk.


quaid:
Tak :)
Avatar billede carstenknudsen Nybegynder
16. april 2002 - 10:06 #12
Hvis du kan fastlægge en syntaks for dit input
er det værd at overveje at bruge regulære udtryk
der er med i SDK1.4.
import java.util.regex.*;
String myInput  = "aaabb";
/**
den pattern vi vil genkende er et
antal a'er (evt ingen) efterfulgt af et
antal b'er (men mindst en).
**/
Pattern myPattern = Pattern.compile("a*b+");
Matcher myMatcher = myPattern.matcher( myInput );
boolean ok = myMatcher.matches();
Avatar billede jakoba Nybegynder
16. april 2002 - 10:10 #13
Der er også nogen der har lavet en klasse til netop det:
http://www.javaregex.com/
Men det kræver dy lærer syntaksen i "Regular Expressions" og den er lidt strid :-))

mvh JakobA
Avatar billede disky Nybegynder
16. april 2002 - 10:12 #14
regular expressions kan bruges, men i det tilfælde hvor man kun skal se om en bestemt karakter forekommer eller ej er det totalt overkill.
Parsningen af en regexp er noget langsom i forhold til .indexOf().

Men skal du f.eks. se om en email adresse er gyldig osv, så er regexp smart.
Avatar billede carstenknudsen Nybegynder
16. april 2002 - 10:19 #15
jakoba: hvis du har en simpel syntaks er det du skal
bruge ret begrænset, capturing groups f.eks. er
unødvendige for simple udtryk. Et simpelt komma tal
uden fortegn men med komma kan udtrykkes ved
Pattern tal = Pattern.compile("[123456789]+[0123456789],[0123456789]");
og det er da ikke så vældig kompliceret.
Avatar billede disky Nybegynder
16. april 2002 - 10:30 #16
carsten:
Hvorfor udnytter du ikke regexp ?

Pattern tal = Pattern.compile("[0-9]+[0-9],[0-9]");

Er lettere at skrive :)
Avatar billede carstenknudsen Nybegynder
16. april 2002 - 10:38 #17
Det var for at gøre det lettere gennemskueligt og du
fangede det tydeligvis :) Jeg ville gerne have skrevet
det som willi10 er ude efter helt præcist, men det mangler
vi at få defineret. Hvis der er en "simpel" syntaks vil
jeg mene at det er den foretrukne løsning. Hvis det
er et spørgsmål om noget så simpelt som et tal er der
i SDK1.4 klasser til håndtering af dette (JSpinner), men
det er det næppe.
Avatar billede jkrag Nybegynder
16. april 2002 - 10:41 #18
Der er en anden simpel mulighed.
Man kan bruge en lidt kreativc bagvendt anvendelse af StringTokenizer til at lave en lille smuk løsning:

String  delimit_alfa = "ABCDEFGHIJKLMNOPQRSTUWVXYZ";
StringTokenizer st1 = new StringTokenizer(strengDerSkalTestes, delimit_alfa, false);
if (st1.countTokens() == 0) {
  System.out.println("Strengen indeholder kun Store bogstaver fra A til Z");
}

------
Dette kan selvfølgelig bruges med en vilkårlig samling tegn.
Avatar billede jakoba Nybegynder
16. april 2002 - 10:41 #19
disky >> enig i at regexp er på grænsen til overkill her.
carsten >> hvis det er så nemt hvorfor macher du så kun tal der har 2 cifre fulgt af een decimal :-))
Pattern tal = Pattern.compile("[1-9]+\d*(,/d*|)");
Avatar billede jakoba Nybegynder
16. april 2002 - 10:43 #20
Ups. foran andet d skal det også være \ (istedetfor /)
Avatar billede jkrag Nybegynder
16. april 2002 - 10:49 #21
F.eks.
String  delimit_alfa = "abcdefgABCDEFG-_0123456789";
Avatar billede carstenknudsen Nybegynder
16. april 2002 - 10:50 #22
jakoba: oops, jeg lavede et testeksempel på laptop'en
interaktivt og skrev det ind fremfor at kopiere det,
og der røg en * til sidst.
disky: du udnyttede vist heller ikke regexp
ifølge din definition er 00000.2 et tal og det
er ikke en pæn måde at skrive noget på :)
Ang. evt overkill kommer det fuldstændig an
definitionen af problemet.
Avatar billede jakoba Nybegynder
16. april 2002 - 11:02 #23
Så 3 eksperter laver en simpel regexp, og ingen af den får den korrekt i første forsøg

jkrag's lsning lyder god :-)
Avatar billede Slettet bruger
16. april 2002 - 11:28 #24
Okay. Jeg er tilbage. Der var lige nogle problemer med netværket så jeg er spændt på at se nærmere på dialogen ;-)
Avatar billede disky Nybegynder
16. april 2002 - 11:37 #25
carsten:
Jeg sagde på intet tidspunkt jeg var regexp expert :-)
Faktisk undgår jeg brugen af dem, for deres syntax er for kryptisk til at det giver et let overskueligt program.
Avatar billede jkrag Nybegynder
16. april 2002 - 12:27 #26
jakoba -> Tak :-)   
(Hvis den opfylder behovet, er det jo en fin løsning lavet udelukkende ved standard java-api uden fancy reg.exp. ting eller java 1.4)
Avatar billede Slettet bruger
16. april 2002 - 12:54 #27
Det er muligt at det ikke er retfærdigt efter al den deltagelse. Men jkrag får de 30 point. Det er muligt at der blandt de mange løsninger er bedre. Men på mit niveau er jkrag's løsning fuldt ud tilstrækkelig (og så har jeg en idé om at jeg forstår hvad det er der sker ;-).
Tak for hjælpen alle sammen.
Avatar billede jkrag Nybegynder
16. april 2002 - 13:32 #28
willi10 -> Så vil jeg da sige mange tak for pointene på forhånd. :-)
Men hvis der er nogle der føler sig alvorligt snydt, så deler jeg da også gerne.
Hilsen Jan
Avatar billede jakoba Nybegynder
16. april 2002 - 13:53 #29
nej da :-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester