Dizionario con chiave

di Anonimizzato22009 il
25 risposte

25 Risposte - Pagina 2

  • @migliorabile
    Ma come è un casino il mio codice..... l ho provato e funziona perfettamente forse mi potrei risparmiare di assegnare la lettera della parola allo schema
    @xneo
    la funzione sigma viene espletata qui
       for(int j = i ;j< lettera.length; j++){
                  //Controllo che non vengano occoppiate 2 lettere alla stessa chiave;
                  if(arrParola[i]!=arrParola[j] && lettera[i]==lettera[j]){
                     return false;
                  }
                  
    se nello schema c'è una lettera maiuscola uguale ad una a cui è già stata assegnata una minuscola e la lettera minuscola corrispondente è diversa da quella assegnata da come ritorno false.
    Comunque proverò a fare altre prove con le mappe che magari è più semplice senza fare 2 cicli.
  • Quella non è la funzione Sigma. Come ti stiamo dicendo @migliorabile e io, la funzione Sigma è un dizionario, una mappa, una funzione, un'array, non so in che altro modo chiamarla.
    Nel codice che hai postato stai controllando che nella parola e nello schema ci devono essere solo lettere maiuscole uguali.
    Fermati a ragionare (ti avevo postato anche un ragionamento con un esempio) perchè così effettivamente stai andando a tentoni.

    PS: Ti do ancora un altro piccolo aiuto.
    Il metodo lo puoi chiamare:
    public static boolean eIstanza(String schema, int[] sigma) {} //o Map<String, String> sigma
    oppure come
    public boolean eIstanza(String schema) {}
    a patto che hai una variabile di istanza int[] sigma o Map<String, String> sigma
  • Così va meglio ?
    
    	 public boolean cercaParola1(String schema){
    				char[] letteraParola =parola.toCharArray();
    				char[] letteraSchema =schema.toCharArray();
    				HashMap<Character,Character> mSchema = new HashMap<>();
    				
    				if(letteraParola.length!= letteraSchema.length)
    					return false;
    				for(int i= 0 ; i< letteraSchema.length; i++){
    					if(Character.isLowerCase(letteraSchema[i])&& letteraSchema[i]!= letteraParola[i]){
    						return false;
    					}else 
    						if (!mSchema.containsKey(letteraSchema[i])){
    							mSchema.put(letteraSchema[i],letteraParola[i]);
    						}else
    							if(mSchema.get(letteraSchema[i])!=letteraParola[i] ){
    								return false;
    							}
    						
    				}
    				     return true;
    				     }
    		 
    
  • Se guardi bene io non sto solo controllando che ci siano lettere maiuscole uguali ma anche che non ci siano lettere minuscole diverse in quella posizione .... ho fatto 2 cicli apposta!
    cmq ora mi da problemi perchè termina il programma quando non dovrebbe e non capisco il motivo
  • E perchè mai dovresti fare questi controlli?
  • Appunto per evitare la ripetizione della stessa chiave a lettere diverse
  • Non ci siamo, tu stai confondendo lo schema con la funzione Sigma. Nella funzione ci deve essere per ogni chiave (che è unica per definizione) un solo valore. Nello schema e nella parola le lettere possono essere anche tutte uguali.
  • Ma è quello che faccio ......cmq l ho riscritto con le mappe hai visto ?

    stev809 ha scritto:


    Così va meglio ?
    
    	 public boolean cercaParola1(String schema){
    				char[] letteraParola =parola.toCharArray();
    				char[] letteraSchema =schema.toCharArray();
    				HashMap<Character,Character> mSchema = new HashMap<>();
    				
    				if(letteraParola.length!= letteraSchema.length)
    					return false;
    				for(int i= 0 ; i< letteraSchema.length; i++){
    					if(Character.isLowerCase(letteraSchema[i])&& letteraSchema[i]!= letteraParola[i]){
    						return false;
    					}else 
    						if (!mSchema.containsKey(letteraSchema[i])){
    							mSchema.put(letteraSchema[i],letteraParola[i]);
    						}else
    							if(mSchema.get(letteraSchema[i])!=letteraParola[i] ){
    								return false;
    							}
    						
    				}
    				     return true;
    				     }
    		 
    
  • Non era quello che stavi facendo.
    Poi, come ti ho detto, ma funzione la devi già avere da qualche parte e la devi usare in sola lettura nell'algoritmo.

    private Map<String, String> sigma=...; //letta da file, costruita da qualche metodo, generata dall'Alto, boh?

    ti riscrivo l'agoritmo di @migliorabile devi leggerlo, capirlo e tradurlo in Java
    boolean eIstanza(schema, parola, sigma):
        se schema e parla hanno lunghezza diversa allora return false
        for i da 0 a lunghezza(schema)-1:
            se schema[i] è minuscolo e schema[i] è diverso da parola[i] allora return false
            altrimenti se schema[i] è maiuscolo e sigma.get(schema[i]) è diverso da parola[i] allora return false; //LEGGI BENE QUI!!!!!!!!!!!
        return true;
    Più chiaro di così non si può fare
  • Ok ok grazie per il suggerimento ..... ma l algoritmo funziona come l ho scritto io .... visto che mi sa che non l hai letto nemmeno .ti ho anche scritto che l ho modificato.
    Grazie dei tuoi PREZIOSI suggerimenti ne farò tesoro
  • L'ho letto e già ti avevo risposto che non andava bene. Poi ti ho risposto ancora con l'algoritmo corretto, quindi era sottinteso che nonostante le modifiche era ancora sbagliato.

    EDIT: Se ci tieni a saperlo, evita di crearti array di char e lavora direttamente con le stringhe.
Devi accedere o registrarti per scrivere nel forum
25 risposte