Ricerca Stringhe "simili"

di il
8 risposte

Ricerca Stringhe "simili"

Salve a tutti.
Ho bisogno di un aiuto per risolvere questo esercizio.
Ho un arralist contenente delle parole. E devo vedere in output tutte le istanze di uno schema.
Ad esempio, se da riga di comando dico che voglio cercare le istanze delle schema baXYXa
E la lista contiene parole come cane, gatto, balena , baccba, catenina.
L'output mi deve mostrare " balena,baccba"
Questo perché le lettere maiuscole " sono ignorate"
E le parole della lista devono contenere nella stessa posizione le stesse lettere dalla mia parola data.
Come posso implementare questo metodo?
Grazie

8 Risposte

  • Re: Ricerca Stringhe "simili"

    Alessia95 ha scritto:


    Questo perché le lettere maiuscole " sono ignorate"
    Come posso implementare questo metodo?
    Se hai "balena" e lo schema "baXYXa", innanzitutto verifichi se hanno stessa lunghezza. Se diversa, ovviamente non possono corrispondere.
    Se sono lunghe uguali, allora fai un ciclo per prendere il carattere i-esimo di entrambe. Se nello schema c'è una lettera maiuscola, non fai nulla. Se è non-maiuscola, allora confronti i caratteri.
    Chiaramente se trovi una differenza, puoi già dire che non corrispondono, senza andare oltre.
  • Re: Ricerca Stringhe "simili"

    andbin ha scritto:


    Alessia95 ha scritto:


    Questo perché le lettere maiuscole " sono ignorate"
    Come posso implementare questo metodo?
    Se hai "balena" e lo schema "baXYXa", innanzitutto verifichi se hanno stessa lunghezza. Se diversa, ovviamente non possono corrispondere.
    Se sono lunghe uguali, allora fai un ciclo per prendere il carattere i-esimo di entrambe. Se nello schema c'è una lettera maiuscola, non fai nulla. Se è non-maiuscola, allora confronti i caratteri.
    Chiaramente se trovi una differenza, puoi già dire che non corrispondono, senza andare oltre.
     public String ricerca(String schema) throws IOException{
    	 
    	 
    	 String patternSchema = schema.replace("[A-Z]", "*");
    	 int lunghezzaSchema = patternSchema.length();
    	
    	 
    	 for( int i =0; i< this.listaParoleArray.size(); i++) {
              
    	         int lunghezzaElemento = this.listaParoleArray.get(i).length();
    		     String elemento = this.listaParoleArray.get(i);
    		     if( lunghezzaSchema == lunghezzaElemento){
    	    
    		           for (int k=0; k < patternSchema.length(); k++) 
    	      
    			            for ( int j =0; j< elemento.length(); j++) 
    	       
    				            if(patternSchema.charAt(k) != '*') {
    				            	if (patternSchema.charAt(k) == elemento.charAt(j))
    				            		
    	            
    					     this.listaParoleArray.add(elemento);
    	                return this.listaParoleArray.toString();
    					      }
    		     }
    	 }
    	return this.listaParoleArray.toString();
     }

    ho provato a implementare cosí, ma non mi da nessun risultato
  • Re: Ricerca Stringhe "simili"

    Va anche bene il replace per mettere "*" (anche se esiste isUpperCase di Character )
    Va bene il ciclo sulla lista (si può migliorare, fai 2 volte il get(i) ).

    Ma NON vanno bene i due cicli interni. Nota che NON servono 2 cicli annidati. Ne basta uno solo, l'indice è lo stesso per entrambe le stringhe, infatti devi confrontare i caratteri alle stesse posizioni.

    Inoltre perché fai:
    this.listaParoleArray.add(elemento);

    ? Stai aggiungendo nella stessa lista su cui stai iterando. Non va bene, ovviamente.

    Anche ammesso di usare una nuova lista, in cui inserire le parole che corrispondono, c'è una questione di "concetto". Quando è che sai di poter aggiungere la parola perché corrisponde? Solo DOPO che hai confrontato tutti i caratteri (a meno degli *). Se un confronto dà diverso, sai già che non dovrai aggiungere la parola. Questo si risolve in diversi modi.

    E infine (detto in generale), non restituire una stringa di una lista. Restituisci la lista degli elementi che corrispondono. Ci penserà il chiamante a farne quello che vuole.

    Prova a pensare a tutto questo.
  • Re: Ricerca Stringhe "simili"

    andbin ha scritto:


    Va anche bene il replace per mettere "*" (anche se esiste isUpperCase di Character )
    Va bene il ciclo sulla lista (si può migliorare, fai 2 volte il get(i) ).

    Ma NON vanno bene i due cicli interni. Nota che NON servono 2 cicli annidati. Ne basta uno solo, l'indice è lo stesso per entrambe le stringhe, infatti devi confrontare i caratteri alle stesse posizioni.

    Inoltre perché fai:
    this.listaParoleArray.add(elemento);

    ? Stai aggiungendo nella stessa lista su cui stai iterando. Non va bene, ovviamente.

    Anche ammesso di usare una nuova lista, in cui inserire le parole che corrispondono, c'è una questione di "concetto". Quando è che sai di poter aggiungere la parola perché corrisponde? Solo DOPO che hai confrontato tutti i caratteri (a meno degli *). Se un confronto dà diverso, sai già che non dovrai aggiungere la parola. Questo si risolve in diversi modi.

    E infine (detto in generale), non restituire una stringa di una lista. Restituisci la lista degli elementi che corrispondono. Ci penserà il chiamante a farne quello che vuole.

    Prova a pensare a tutto questo.
    Grazie mille per la risposta veloce e precisa. Proverò a sistemare!
  • Re: Ricerca Stringhe "simili"

    Alessia95 ha scritto:


    Ho un arralist contenente delle parole. E devo vedere in output tutte le istanze di uno schema.
    Ad esempio, se da riga di comando dico che voglio cercare le istanze delle schema baXYXa
    Oltre alla soluzione "fatta a mano" che stai implementando, e che è sicuramente un ottimo modo per prendere confidenza con il linguaggio e fare esercizio, se può interessarti questo è il tipico caso di utilizzo delle espressioni regolari.
    Puoi utilizzare la classe java.util.regex.Pattern e altre classi collegate come Matcher.

    Con le espressioni regolari hai a disposizione un potenziale enorme, e sono anche relativamente semplici da usare, una volta fatta un po' di pratica.

    Ad esempio se volessi confrontare quello schema baXYXa per una determinata stringa s, potresti scrivere :
    
    if (Pattern.matches ("ba[a-z]{3}a", s))) {
    	// ... aggiungi s alla lista o qualsiasi altra cosa
    }
    if (Pattern.matches ("ba([a-z])[a-z]\\1a", s) {
    	// ...
    }
    
    Nel secondo if il pattern richiede anche che la prima delle tre lettere minuscole qualsiasi ("X") sia uguale alla terza, come io avrei capito da baXYXa.
    Ma puoi fare cose molto più avanzate
  • Re: Ricerca Stringhe "simili"

    Ansharja ha scritto:


    Alessia95 ha scritto:


    Ho un arralist contenente delle parole. E devo vedere in output tutte le istanze di uno schema.
    Ad esempio, se da riga di comando dico che voglio cercare le istanze delle schema baXYXa
    Oltre alla soluzione "fatta a mano" che stai implementando, e che è sicuramente un ottimo modo per prendere confidenza con il linguaggio e fare esercizio, se può interessarti questo è il tipico caso di utilizzo delle espressioni regolari.
    Puoi utilizzare la classe java.util.regex.Pattern e altre classi collegate come Matcher.

    Con le espressioni regolari hai a disposizione un potenziale enorme, e sono anche relativamente semplici da usare, una volta fatta un po' di pratica.

    Ad esempio se volessi confrontare quello schema baXYXa per una determinata stringa s, potresti scrivere :
    
    if (Pattern.matches ("ba[a-z]{3}a", s))) {
    	// ... aggiungi s alla lista o qualsiasi altra cosa
    }
    if (Pattern.matches ("ba([a-z])[a-z]\\1a", s) {
    	// ...
    }
    
    Nel secondo if il pattern richiede anche che la prima delle tre lettere minuscole qualsiasi ("X") sia uguale alla terza, come io avrei capito da baXYXa.
    Ma puoi fare cose molto più avanzate
    Grazie!!!
  • Re: Ricerca Stringhe "simili"

    Sono quasi arrivata alla soluzione. A prescindere dalla consegna dell'esercizio che avevo scritto prima(che è stata modificata), adesso il problema che sorge è che le parole vengono raddoppiate. Se cerco le istanze dello schema "baXYZa", e nella mia lista ho parole come [, [ananas, balena, banana, cane, cavallo, cena, dado]l'OUTPUT è [balena, balena, balena, banana, banana, banana], mentre la soluzione giusta è [balena, banana].
    Mentre se cerco le istanze di "cXYZ" ho in output [cane,cena] (che è giusto, e non capisco come mai certe volte funziona e altre no, non riesco a trovare l'errore).


    public Operazioni ricerca(String schema) throws IOException{
    	 String elemento = null;
    	 int i =1;
    	 int k=0;
    	 ArrayList<String> lista = new ArrayList<String>();
    	  
    	 String patternSchema = schema;
    	 int lunghezzaSchema = patternSchema.length();
    	 
    	 
    	 for(  i = 1; i< this.listaParoleArray.size();i++) {
              
    	         int lunghezzaElemento = this.listaParoleArray.get(i).length();
    		     elemento = this.listaParoleArray.get(i);
    		     boolean lunghezzaUguale = (lunghezzaElemento == lunghezzaSchema);
    		     
    		     if ( lunghezzaUguale) {
    		     
    		    	 
    		    	 for ( k = 0; k < patternSchema.length();k++) {
    	                             
    		        	   char letteraSchema = patternSchema.charAt(k);
    	                   char letteraElemento = elemento.charAt(k);
    			                    
    	                             if(Character.isUpperCase(letteraSchema)){
    			                          char letteraMaiuscola = letteraSchema;
    			                          int pos = patternSchema.indexOf(letteraSchema);
    			                                                                               
    			                           for (int y = pos+1; y < patternSchema.length(); y++) {
    			                                                                               
    			                                	if(letteraMaiuscola == patternSchema.charAt(y)){
    			                                		int pos2 = patternSchema.indexOf(patternSchema.charAt(y));                                     
    			                                		
    			                                		if(elemento.charAt(pos) == elemento.charAt(pos2))
    			                                			
    			                                			lista.add(elemento); 
    			                                	} 
    			                                
    			                                	  
    			                           }                                                      
    			                           
    	                             } else if (Character.isLowerCase(letteraSchema)){
    			                                                                             
    	                            	 if(letteraSchema == letteraElemento) 
    	                            		                                              
    	                            		 lista.add(elemento);
    	                            	       
    	                            	 
    			                       }   
    			                     
    			            } 
    		     }  
    	 }        
    	 
    	 this.listaParoleArray = lista; 
    	          
    	return new Operazioni();
    }
  • Re: Ricerca Stringhe "simili"

    Non ho letto tutto tutto in dettaglio ma .... dalla lunghezza del codice una cosa posso dirla: troppo lungo e troppo "contorto".
    Ti assicuro che verrebbe molto MOLTO più semplice. Cerca di "ragionare" un po' meglio.

    P.S. non ho neanche capito a che serve ritornare un Operazioni di cui non ho idea cosa rappresenti e cosa contenga.

    P.S. 2: rileggi cosa ho detto in precedenza.
Devi accedere o registrarti per scrivere nel forum
8 risposte