2015-11-14 12 views
6

Quindi ho un file che contiene tutti i presidenti: il loro nome, iniziale iniziale (se presente) e cognome.Ricerca nome array stringa

Il file deve essere letto e un utente può immettere il nome di un presidente per cercarlo e il presidente deve essere visualizzato.

Ho visualizzato il presidente se un utente cerca per nome o per cognome, ma non per entrambi.

Ad esempio, il file esterno contiene:

George,Washington,(1789-1797) 
Franklin,D.,Roosevelt,(1933-1945) 
... and so on with all the presidents 

Ho bisogno che l'utente sia in grado di entrambi i tipi nel nome, il cognome, o entrambi nome e cognome e di ottenere il risultato desiderato (la data è irrilevante per la maggior parte).

Ho provato un sacco di cose diverse, ma non ci sono arrivato per quanto riguarda la visualizzazione del presidente se l'utente cerca per nome e cognome.

Ecco quello che ho ottenuto finora:

public class NameSearch { 

    public static void main(String[] args) throws IOException { 

     try { 
      // read from presidents file 
      Scanner presidentsFile = new Scanner(new File("Presidents.txt")); 
      // scanner for user input 
      Scanner keyboard = new Scanner(System.in); 
      // create array list of each line in presidents file 
      ArrayList<String> presidentsArrayList = new ArrayList<String>(); 

      // prompt user to enter a string to see if it matches with a president's name 
      System.out.println("Enter a search string of letters to find a president match: "); 
      // store user input 
      String userInput = keyboard.nextLine(); 

      // add president file info to array list linesInPresidentFile 
      while (presidentsFile.hasNextLine()) { 
       presidentsArrayList.add(presidentsFile.nextLine()); 
      } // end while loop 

      String presidentNamesArray[] = presidentsArrayList.toArray(new String[presidentsArrayList.size()]); 
      String results = searchArray(presidentNamesArray, userInput); 

      //System.out.println("\nThe presidents who have \"" + userInput + "\" as part of their name are: "); 

     } catch (FileNotFoundException ex) { 
      // print out error (if any) to screen 
      System.out.println(ex.toString()); 

     } // end catch block 

    } // end main 

    // method to search for a specific value in an array 
    public static String searchArray(String array[], String value) { 

     for (int i = 0; i < array.length; i++) { 
      if (array[i].toLowerCase().contains(value.toLowerCase())) { 
       String splitter[] = array[i].split(" ,"); 
       System.out.println(Arrays.toString(splitter)); 
      } 

     } 
     return Arrays.toString(array); 
    } 

} 
+0

vuoi chiedere? – sunysen

+0

Umm ... cosa? Sì, voglio chiedere lol ... – rockymontana

risposta

2

C'è un altro modo in cui avrei potuto implementato this.Read gli ingressi di file e li memorizzati come oggetti (classe con lname, fname e anno forse) . In questo modo puoi cercare lname dall'input dell'utente, abbinarlo con il suo fname corrispondente (come gli stessi oggetti). La creazione può essere eseguita una sola volta e la ricerca può essere eseguita in un ciclo temporale, implementando il consenso degli utenti a continuare la ricerca.

//define your class like this: 
static int i; //to keep a track of number of objects 
public class dummy{ 
string fname; 
string lname; 
string year; 
}; 

while the file content exists: 
read the line 
dummy dobj[i++] = new dummy();//allocate memory for the object 
split the different parameters (fname, lname, year) from the read line 
put these read parameters into the object 
dobj[i].fname = first; 
dobj[i].lname = second; 
dobj[i].year = y; 

//ask your user to enter the query in a specified format 
//if he enters lname, compare your input to all the object's lname, and so on 
//in case of lname && fname, compare your input to the lname first and then check for the corresponding objects fname, if they match.. display 

In realtà, ci sono molti modi in cui è possibile ottenere ciò che si desidera programmare. Puoi chiedere di usare gli indici dell'elenco di array per risolverlo. Se si immette l'input dell'utente in un formato particolare, è possibile associarlo all'indice in tale elenco. Inoltre, se si desidera utilizzare il nome e il cognome insieme, è possibile utilizzare questi indici che rappresentano il nome e il cognome che provengono dalla stessa lista.

+0

Purtroppo non seguo. Pensi di poter postare qualche codice di avvio, per favore? – rockymontana

+0

Non sono un esperto di java, ma posso aiutarti con uno pseudo codice – Rubal

+0

Non esperto in java, e non posso seguirlo in termini di codice, ma grazie mille per l'aiuto !! – rockymontana

0

Il motivo per cui potresti avere problemi a cercare sia per nome che per cognome è perché devi corrispondere esattamente al tuo input (ovviamente ignorando il caso). Ciò che intendo è che se si utilizza George Washington come input, il programma non troverà una corrispondenza per la riga George,Washington,(1789-1797). Questo perché il tuo programma tratta George Washington come una stringa. Nota: l'input manca la virgola, quindi non sarà considerata una sottostringa di George,Washington,(1789-1797). Se hai usato George,Washington come stringa di input, il tuo programma stamperebbe la riga di George Washington. Il tuo programma cerca solo se la stringa di input è una sottostringa di una qualsiasi delle righe nel tuo file. Non cerca in modo specifico il nome o il cognome. Se si utilizzava in come stringa di input, si otterrebbe una corrispondenza per entrambi George Wash in gton e Frankl in D. Roosevelt.

Quello che potresti fare è prendere i tuoi dati di input e dividerli e cercare ognuno dei termini. Puoi accettare linee che corrispondono a tutti i termini forniti, o almeno uno dei termini forniti.

public static String searchArray(String array[], String value) { 
    // Uses both blank spaces and commas as delimiters 
    String[] terms = value.toLowerCase().Split("[ ,]"); 

    for (int i = 0; i < array.length; i++) { 
     String line = array[i].toLowerCase(); 
     boolean printIfAllMatch = true; 
     boolean printIfAtLeastOneMatches = false; 
     for(int j = 0 ; j < terms.length; j++) { 
      // Check that all terms are contained in the line 
      printIfAllMatch &= line.Contains(terms[j]); 
      // Check that at least one term is in the line 
      printIfAtLeastOneMatches |= line.Contains(terms[j]); 
     } 

     String splitter[] = array[i].split(" ,"); 
     if (printIfAllMatch) { 
      System.out.println(Arrays.toString(splitter)); 
     } 
     if(printIfAtLeastOneMatches) { 
      System.out.println(Arrays.toString(splitter)); 
     } 

    } 
    //I'm not sure why you're returning the original array as a string 
    //I would think it would make more sense to return an Array of filtered data. 
    return Arrays.toString(array); 
} 

Questo non tiene conto del nome dell'ordine. Se questo è ciò che stai cercando, allora suggerirei di creare una classe e analizzare ogni riga del file come un nuovo oggetto e provare a far corrispondere il primo termine fornito con il nome e il secondo termine forniti con il cognome, o qualcosa del genere A tal fine.

+0

Apprezzo tutto questo. Tuttavia, questo non visualizza nulla indipendentemente da ciò che digito ... – rockymontana

+0

Potresti fornire esempi di ciò che è o non funziona? Immagino di non capire bene il tuo problema. – drg