Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Metodo che converte una stringa in ore minuti e secondi..

    Salve devo realizzare un metodo che mi converte la stringa in input di un metodo in array di interi di tre elementi contenenti rispettivamente ore,minuti e secondi.
    Ho sbattuto la testa per quasi due giorni ma non ho concluso nulla.
    Ho pensato a tutti i tipi di controlli possibile ma non riesco a gestire tutti i possibili casi di stringhe in input del tipo "20.10.50" (Caso limite massimo) o "5.2.4" (caso limite minimo) o ancora "15.5.2" o "20.4.15" ecc insomma tutte le possibili combinazioni per stringhe formate da due o una cifra per ore minuti e secondi.
    Vi allego l'immagine per le specifiche, mi scuso per la qualità e se nel caso non capite qualcosa me lo dite.
    Grazie a chi me lo sapra spiegare per bene...Io in due giorni non ho ancora capito che genere di controlli effettuare per includere tutti i possibili casi di stringhe in input...

    ps. Esiste qualche metodo nelle API di java che mi consente di prendere in considerazione tutto ciò che trovo prima del "." e metterlo nell'array di ritorno per il conteggio delle ore e così via?
    Immagini allegate Immagini allegate
    Ultima modifica di applefriend; 10-12-2014 a 16:38

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Le API di Java ti permettono di fare molto di più.
    Documentati sul metodo split() della classe String.
    Poi documentati sul metodo parseInt() della classe Integer, in particolare la versione a due parametri.

    Il primo metodo ti consente di spezzettare una stringa usando una regex come separatore: questo ti permette di spezzettare la stringa iniziale in N sottostringhe in cui il punto risulta essere il separatore (attenzione: l'argomento è una RegEx ed il punto è un carattere speciale!)

    Il secondo converte una stringa in numero, dicendogli esattamente qual è la base in cui il numero è espresso: aiuta molto, questa seconda versione!

    Il resto dei controlli sono normali routine di controllo orari.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Le API di Java ti permettono di fare molto di più.
    Documentati sul metodo split() della classe String.
    Poi documentati sul metodo parseInt() della classe Integer, in particolare la versione a due parametri.

    Il primo metodo ti consente di spezzettare una stringa usando una regex come separatore: questo ti permette di spezzettare la stringa iniziale in N sottostringhe in cui il punto risulta essere il separatore (attenzione: l'argomento è una RegEx ed il punto è un carattere speciale!)

    Il secondo converte una stringa in numero, dicendogli esattamente qual è la base in cui il numero è espresso: aiuta molto, questa seconda versione!

    Il resto dei controlli sono normali routine di controllo orari.


    Ciao.
    Ti ringrazio per la tempestività della risposta, ho controllato il metodo split, ho visto dalle api che mi divide la stringa in un array di stringhe dando in input la "Stringa separatrice" ho provato con il punto e come mi hai scritto è un carattere speciale, l'alternativa sarebbe generare una nuova stringa con il punto sostituito da un carattere qualunque che non sia un numero tipo "a" (c'è un altro metodo alternativo senza sostituire le occorrenze di "." con un carattere che non sia speciale?) e dovrei applicare il metodo split a questa nuova stringa e ottenere un array contenente le stringhe separate poi potrei parserizzare le stringhe ottenute presenti nell'array. Non capisco cosa serve parseInt a due parametri...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Non serve sostituire il carattere, basta usare il quoting. Se un carattere è speciale, allora va quotato e siccome il singolo quote è una caratteristica del linguaggio Java, allora va doppiamente quotato per farlo passare al motore di RegEx:


    codice:
    String orario = "15.09.20";
    String[] pezzetti = orario.split("\\.");

    Effettivamente, controllando meglio, a te il parseInt() a due parametri non serve, in quanto già quello a parametro singolo usa la base 10 come default... ricordavo una cosa diversa.
    Ad ogni modo, parseInt() a due parametri permette di specificare la base in cui il numero è rappresentato come stringa. Ad esempio, se la stringa mi rappresenta un numero in base 8, posso specificarlo ed effettuarne il parsing senza dover star lì a convertirlo.


    codice:
    String str = "043";   // 43 in base 10, ma 35 in base 8
    System.out.println( Integer.parseInt(str) );   // Stampa 43
    System.out.println( Integer.parseInt(str, 10) );   // Stampa 43 (equivalente a quella sopra)
    System.out.println( Integer.parseInt(str, 8) );   // Stampa 35

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Esempio generale che copre tutto, vedi se riesci a migliorarlo
    codice:
    public static int[] scanTime(String timeStr){
            char[] chars = timeStr.toCharArray();
            String[] tm = {"0","0","0"};
            int[] time = {0,0,0};
            int t = 0;
    
    
            for(char i : chars) {
                if (Character.isDigit(i))
                    tm[t] += i;
                else if (i == '.' || i == ':')
                    t++;
                else break;
            }
    
    
            for(; t > -1; t--) {
                int val = Integer.parseInt(tm[t]);
                switch(t) {
                    case 0:
                        if(val > 24) continue;
                    case 1:
                    case 2:
                        if(val < 0 || val > 60) continue;
                        break;
                }
                time[t] = val;
            }
    
    
            return time;
        }

  6. #6
    perfetto, grazie mille molto chiaro. Sono alle prime armi e sto cercando di fare piu esercizi possibili.
    Alla fine senza vedere il metodo implementato da te, l'ho svolto da solo e ci sono riuscito, se volete lo posto così magari può essere utile a tutti

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Quote Originariamente inviata da applefriend Visualizza il messaggio
    perfetto, grazie mille molto chiaro. Sono alle prime armi e sto cercando di fare piu esercizi possibili.
    Alla fine senza vedere il metodo implementato da te, l'ho svolto da solo e ci sono riuscito, se volete lo posto così magari può essere utile a tutti
    Certo, così magari ti si possono anche suggerire eventuali ottimizzazioni o migliorie.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    codice:
    public class TimeUtils {
    
    	public TimeUtils() {
    
    
    	}
    
    
    	public static int[] scanTime(String timeStr) {
    
    
    		int maxSize = 3;
    		int[] time = new int[maxSize];
    
    
    		if (timeStr.equals("")) { // se è la stringa vuota imposto 0 a tutto
    			time[0] = 0;
    			time[1] = 0;
    			time[2] = 0;
    		} else {// se non è una stringa vuota
    
    
    			String replaced = timeStr.replace('.', 'a'); 
    
    
    			String[] timeString = replaced.split("a"); 
    
    
    			int ore = Integer.parseInt(timeString[0]); 
    														
    			
    			time[0] = ore; // inserisco le ore nell'array di ritorno
    
    
    			if (timeString.length == 3) {
    				
    				int minuti = Integer.parseInt(timeString[1]); 
    				time[1] = minuti;
    				int secondi = Integer.parseInt(timeString[2]);
    				time[2] = secondi;
    			}
    
    
    			else if (timeString.length == 2) {
    			
    				int minuti = Integer.parseInt(timeString[1]); 
    				time[1] = minuti;
    			}
    
    
    		}
    
    
    		return time;
    
    
    	}
    
    
    	public static void main(String[] args) {
    
    
    		int[] orario = scanTime("13.35.43");
    		for (int i = 0; i < orario.length; i++) {
    			System.out.println(orario[i]);
    		}
    
    
    	}
    
    
    }
    E' da correggere lo split invece di sostituire le occorrenze di "." con "a", bisogna fare split "\\."

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Ok.
    Ho notato che nel metodo non effettui i controlli sulla correttezza semantica dell'orario: cioè, non verifichi che le ore siano nel range [0..23] e che minuti e secondi siano nel range [0..59].

    Io ora ti propongo due alternative. Una più o meno equivalente alla tua (che non effettua controlli semantici) senza usare il meccanismo delle eccezioni; un'altra che, invece, usa il meccanismo delle eccezioni ed in più effettua anche i controlli semantici di cui sopra. Prova a vedere se riesci a capire come funzionano.
    Ah... in entrambe le versioni il separatore usato nella stringa viene passato come argomento (come RegEx), così da rendere la funzione più generale.

    Versione 1:
    codice:
       private static int[] scanTime(String strOrario, String separatore) {
          int[] nums = {0, 0, 0};
    
          String[] hhmmss = strOrario.split( separatore );
          try {
             for(int i=0; i<3; i++) nums[i] = Integer.parseInt( hhmmss[i] );
          } catch (NumberFormatException nfe) { /* ignoro */ }
    
          return nums;
       }


    Versione 2:

    codice:
       private static int[] scanTime(String strOrario, String separatore) throws NumberFormatException {
          int[] nums = new int[3];
    
          String[] hhmmss = strOrario.split( separatore );
          for(int i=0; i<3; i++) nums[i] = Integer.parseInt( hhmmss[i] );
    
          // Controlli numerici
          if ((nums[0] < 0) || (nums[0] > 23)) throw new NumberFormatException("Valore non valido per le ore: " + hhmmss[0]);
          if ((nums[1] < 0) || (nums[1] > 59)) throw new NumberFormatException("Valore non valido per i minuti: " + hhmmss[1]);
          if ((nums[2] < 0) || (nums[2] > 59)) throw new NumberFormatException("Valore non valido per i secondi: " + hhmmss[2]);
    
          return nums;
       }

    Ciao.
    Ultima modifica di LeleFT; 11-12-2014 a 19:06
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Ti ringrazio, ma ho notato che se in input do la stringa "12.2" (esplicitando solo ore e minuti, il metodo non funge), c'è un modo per dire "se esiste un elemento in posizione 1 dell'array allora parserizzalo e inseriscilo nell'array di ritorno".
    Ho provato a scrivere if (hhmmss[1] != null) ma non funziona....
    perchè appunto secondo le specifiche posso esplicitare solo ore, o solo ore e minuti oppure ore,minuti e secondi.
    Ultima modifica di applefriend; 13-12-2014 a 16:06

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.