apoi provin dintr-un fond C (inițial orliginic, deși nu am folosit acea limbă de aproape 5 ani) și încerc să analizez unele valori ale unui lanț în Java. În c i-aș folosi Sscanf. În Java, oamenii mi-au spus „Utilizați scanerul sau StringToKenizer”, dar nu văd cum să le folosesc pentru a-mi atinge scopul.
lanțul meu de intrare arată ca „17-Mar-11 15.52.25.000000000” . În c aș face ceva de genul:
divid id = „65BC9EBC41″>
dar în Java, tot ce pot face este cum ar fi:
scanner.nextInt();
Acest lucru nu-mi permite să verific modelul și pentru „marea” am terminat să fac lucruri cum ar fi:
str.substring(3,6);
Oribil! Desigur, există o cale mai bună?
Răspunsuri
37 Pentru răspunsul № 1
Problema este că Java nu are parametri (sau trece prin referință) ca C sau C #.
Dar există o cale mai bună (și mai solidă). Utilizați expresii regulate:
Desigur, codul este mai concis, dar tehnic furat are un beneficiu: modelele specifică un format mai precis decât „% s” Și „% d”. Prin urmare, puteți utiliza D {2} pentru a specifica că acea zi trebuie să fie compusă exact cu 2 cifre.
21 pentru răspunsul № 2
aici este o soluție cu scanere:
Scanner scanner = new Scanner("17-MAR-11 15.52.25.000000000");Scanner dayScanner = new Scanner(scanner.next());Scanner timeScanner = new Scanner(scanner.next());dayScanner.useDelimiter("-");System.out.println("day=" + dayScanner.nextInt());System.out.println("month=" + dayScanner.next());System.out.println("year=" + dayScanner.nextInt());timeScanner.useDelimiter("\.");System.out.println("hour=" + timeScanner.nextInt());System.out.println("min=" + timeScanner.nextInt());System.out.println("sec=" + timeScanner.nextInt());System.out.println("fracpart=" + timeScanner.nextInt());
8 pentru răspunsul № 3
Niciunul dintre aceste exemple nu a fost într-adevăr satisfăcător pentru mine, așa că am făcut propria mea utilitate Java Sscanf:
https://github.com/driedler/java-sscanf/tree/master/src/util/sscanf
aici este un exemplu de analiză a unui șir hexazecimal:
String buffer = "my hex string: DEADBEEFn"Object output = Sscanf.scan(buffer, "my hex string: %Xn", 1);System.out.println("parse count: " + output.length);System.out.println("hex str1: " + (Long)output);// Output:// parse count: 1// hex str1: 3735928559
3 pentru răspunsul № 4
pentru „17-Mar-11 15.52.25.000000000”:
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSS");try{Date parsed = format.parse(dateString);System.out.println(parsed.toString());}catch (ParseException pe){System.out.println("ERROR: Cannot parse "" + dateString + """);}
2 pentru răspunsul № 5
Acest lucru este departe de a fi o astfel de soluție elegantă cum ar fi obținută Cu utilizarea expresiilor regulate, dar ar trebui să funcționeze.
divid id = „1032A4F956″>
0 pentru răspunsul № 6
Știți conceptul de expresii regulate? Java vă oferă posibilitatea de a utiliza expresii regulate folosind clasa de model. Uită-te la acest lucru: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
Puteți testa lanțul în acest mod:
Matcher matcher = Pattern.match(yourString);matcher.find();
apoi utilizați metodele furnizate de Matcher pentru a manipula lanțul pe care l-ați găsit sau nu.
-3 pentru răspunsul № 7
System.in.Read () este o altă opțiune.