Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Java Table, algoritmo ricerca stringa.

    Per favore qualcuno potrebbe aiutarmi?

    Scopo dell'algoritmo:
    cercare una stringa in una colonna di una tabella e popolare la riga contenente la stringa.
    Ricerca ad ogni click.


    Il programma deve:

    1) dopo click del button e tramite comboBox selezionare stringa (es. A);
    2) cercare la stringa selezionata in tutte le righe nella colonna "0";
    3) trovata la stringa selezionata deve popolare la riga. Alla prima stringa trovata però dopo averla popolata si dovrà fermare fino al click successivo.
    4) al click successivo continuerà la ricerca della stringa nelle righe successive.
    5) se si cambia la stringa la ricerca dovrà cominciare dalla riga "0" naturalmente

    Io ho provato così ma non funziona:

    codice:
     if (comboBox1.equals("A")) {
                index = 0;
                for (int i = 0; i < Table.getRowCount() - 1; i++) {
                    if ((Table.getValueAt(i, 0).equals("A")) {
                    
                        index = i;
    
                        }
                         
                    }
                    else return;
    //esempio di popolamento sulla riga dove è stata trovata la stringa
                    Table.setValueAt("pippo", index, 0);
                    Table.setValueAt("pippo1", index, 1);
                    Table.setValueAt("pippo2" , index, 2);
    }
    Ringrazio chi voglia aiutarmi! Come si suo dire mi sono alluppato!!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Re: Java Table, algoritmo ricerca stringa.

    Originariamente inviato da marcotto68
    Io ho provato così ma non funziona:
    "Non funziona" non vuol dire nulla.
    Devi essere più preciso: non ottieni i risultati voluti? Ottieni delle eccezioni? Non compila? Non restituisce nulla?

    PS: il codice va postato all'interno degli appositi tag CODE (come da Regolamento interno), altrimenti perde formattazione ed indentazione. Correggo io.

    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
    Non funziona vuol dire che l'algoritmo non fa quello che mi aspetto.
    Naturalmente ho estratto solo la parte di codice del progetto che interessa la mia domanda.
    Credo che sia un algoritmo abbastanza comune e potrebbe essere utile a tutti per molte situazioni simili.


    Quello che fa attualmente?

    Funziona solo per la prima riga. Cioè la popola, la colora e si ferma!

    Grazie ancora

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Non ho ben capito che ragionamento hai fatto, ma per prima cosa rivedrei la condizione del for:

    codice:
    for (int i = 0; i < Table.getRowCount() - 1; i++) {
    così facendo prendi in considerazione tutte le righe tranne l'ultima. Togli il -1.


    Poi, questo codice non compila nemmeno:
    codice:
       if ((Table.getValueAt(i, 0).equals("A")) {
          index = i;
       }
                         
    } else return;
    visto che l'else è riferito alla chiusura della graffa relativa al for... anche se fosse riferito alla graffa del if, non avrebbe molto senso... "se la colonna 0 della riga i (che inizialmente è 0) non contiene la stringa cercata, esco dal metodo"... forse dovresti continuare a cercare nelle righe succesive, altrimenti a che ti serve il for??

    L'istruzione "return" non fa uscire né da un if (che è ciò che serve a te), né tantomeno dal for (sarebbe un break, che comunque non ti serve), ma dall'intero metodo.

    Dovresti rivederlo completamente quell'algoritmo...

    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
    Return era un rimasuglio di codice utilizzato per verificare se leggeva la stringa.

    Quindi se ho capito bene:

    Cerca stringa "A"

    1) Cicla su tutte le righe
    2) Se trovi stringa "A" table(i,column)
    3) popola la tabella(i,column)

    E' qui che non capisco:
    4) a questo punto si dovrebbe fermare ed al click successivo ricercare e popolare la riga successiva (contenente la stringa)


    codice:
    
    if (comboBox1.equals("A")) {
                index = 0;
                for (int i = 0; i < Table.getRowCount() ; i++) {
                    if ((Table.getValueAt(i, 0).equals("A")) {
                    
                        index = i;
    
                        }
                         
                    }
                 
    //esempio di popolamento sulla riga dove è stata trovata la stringa
                    Table.setValueAt("pippo", index, 0);
                    Table.setValueAt("pippo1", index, 1);
                    Table.setValueAt("pippo2" , index, 2);
    }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Allora, vediamo.
    Ti serve una variabile in cui memorizzare l'ultima riga trovata, in modo da fare ripartire, eventualmente, il controllo da lì.

    Poi, è concettualmente sbagliato effettuare un controllo sul valore selezionato nella combobox: il metodo che controlla la tabella dovrebbe solo prendere il valore selezionato e cercarlo (qualunque esso sia: non deve, quindi, essere codificato il valore nella ricerca). Quello che va fatto, a parte, è il "reset" della variabile che memorizza l'ultima riga trovata, quando viene scelto un valore diverso (ma questo lo vedremo più avanti).

    Prima cosa, a livello di classe, dichiariamo una variabile in cui memorizzare l'ultima riga trovata
    codice:
    public class ... {
       // Dichiariamo la variabile che conterrà l'ultima riga trovata
       // e la inizializziamo a -1 (nessuna riga trovata)
       private int lastRowFound = -1;
       ...
    }
    Nel metodo di ricerca, prendiamo il valore della combobox e, senza preoccuparci di controllare che sia "A", "B", "C" o quel che ti pare, verifichiamo semplicemente se lo troviamo nella colonna 0 della tabella:

    codice:
    public void ricercaInTabella() {
       String valoreDaCercare = (String) tuaComboBox.getSelectedValue();
    
       // Scorro la tabella alla ricerca della stringa nella prima colonna
       // ma non parto sempre da 0!! Parto dalla riga successiva all'ultima trovata
       int k = lastRowFound + 1;
       for(; k<Table.getRowCount(); k++) {
          if ( Table.getValueAt(k, 0).equals(valoreDaCercare) ) {
             // Ho trovato una riga, mi salvo l'indice e fermo il ciclo
             lastRowFount = k;
             break;
          }
       }
    
       // Se esco dal ciclo e k è uguale al numero di righe, vuol dire che non
       // ho trovato nulla (non so se devi dare qualche messaggio)
       if (k == Table.getRowCount()) {
          ...   // non ho trovato nulla
       }
    }
    Per fare in modo di "resettare" la variabile se viene scelto un valore diverso dalla ComboBox ho bisogno di un'altra variabile in cui memorizzare il valore scelto in precedenza per poterlo confrontare con quello nuovo appena scelto:

    codice:
    public class ... {
       // Dichiariamo la variabile che conterrà l'ultima riga trovata
       // e la inizializziamo a -1 (nessuna riga trovata)
       private int lastRowFound = -1;
    
       // Dichiariamo la variabile che conterrà l'ultima scelta fatta
       // dalla ComboBox e inizializziamola a null
       private String lastValueSelected = null;
       ...
    }
    Ora, dobbiamo aggiungere un ActionListener alla JComboBox che verrà azionato quando l'utente cambia la selezione:
    codice:
    tuoComboBox.addActionListener( new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent ae) {
          // Questo metodo viene invocato quando l'utente clicca
          // su uno degli elementi della combobox. Quindi, richiamo un
          // metodo che dovrà verificare se la selezione è stata cambiata
          // oppure no ed, in caso affermativo, resettare la variabile lastRowFound
          verificaCambioSelezione();
       }
    });
    
    ...
    
    private void verificaCambioSelezione() {
       // Se viene invocato questo metodo, significa che l'utente ha cliccato su un
       // elemento della combo box... verifico se ha cambiato la selezione
       String newSelection = (String) tuaComboBox.getSelectedValue();
       if ( !newSelection.equals(lastValueSelected) ) {
          // Sì, ha cambiato valore! Resetto la variabile e
          // memorizzo questo nuovo valore
          lastRowFound = -1;
          lastValueSelected = newSelection;
       }
    }
    E questo dovrebbe essere quanto.


    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

  7. #7
    Mamma mia, spiegazione chiarissima, bravissimo! Non ci sarei mai arrivato da solo a questa soluzione.
    Grazie tantissimo, vi terrò natiralmente informati.

    Ciao

  8. #8

    Thread chiuso e risolto!!

    Grazie Lele, ho applicato il tuo codice nel mio porogramma e tutto funziona correttamente!!!

    Grazie ancora

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.