2015-11-14 29 views
6

So habe ich eine Datei, die alle Präsidenten darin hat - ihren Vornamen, mittlere Anfangs (falls vorhanden) und Nachname.String-Array-Namen suchen

Die Datei muss eingelesen werden, und ein Benutzer kann den Namen eines Präsidenten eingeben, um danach zu suchen, und dieser Präsident sollte angezeigt werden.

Ich habe es anzeigen den Präsidenten, wenn ein Benutzer sucht nach Vorname oder Nachname, aber nicht von beiden.

Zum Beispiel kann die externe Datei enthält:

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

ich den Benutzer müssen entweder den ersten Namen in der Lage sein, den Nachnamen oder beides Vor- und Nachnamen und erhalten das gewünschte Ergebnis (das Datum ist größtenteils irrelevant).

Ausprobiert viele verschiedene Dinge, aber nicht so weit wie die Anzeige des Präsidenten, wenn der Benutzer sucht nach Vor- und Nachnamen. Hier

ist, was ich habe, so weit:

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

möchten Sie fragen? – sunysen

+0

Umm ... was? Ja, ich möchte lol fragen ... – rockymontana

Antwort

2

Es gibt eine andere Art und Weise, in der ich habe implementiert könnte die Dateieingänge und gespeichert, sie als Objekte (Klasse mit lname, fname und Jahr vielleicht) this.Read . Auf diese Weise können Sie nach lname aus einer Benutzereingabe suchen und sie mit dem entsprechenden fname (als gleiche Objekte) abgleichen. Die Erstellung kann einmal durchgeführt werden, und die Suche kann in einer while-Schleife erfolgen, wobei die Zustimmung der Benutzer zur Fortsetzung der Suche implementiert wird.

//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 

Eigentlich gibt es viele Möglichkeiten, wie Sie erreichen können, was Sie programmieren möchten. Sie können fragen, verwenden Sie die Array-Liste Indizes, um es zu lösen. Wenn Sie die Eingabe des Benutzers in einem bestimmten Format übernehmen, können Sie sie dem Index in dieser Liste zuordnen. Wenn Sie den Vor- und Nachnamen zusammen verwenden möchten, können Sie diesen Index verwenden, der den Vor- und Nachnamen aus derselben Liste enthält.

+0

Ich bin mir nicht sicher, ob ich leider folge. Können Sie bitte einen Startcode posten? – rockymontana

+0

Ich bin kein Experte in Java, aber ya, kann ich Ihnen mit einem Pseudo-Code – Rubal

+0

nicht kompetente in Java selbst, und kann nicht wirklich das in Bezug auf Code folgen, aber vielen Dank für helpin heraus! – rockymontana

0

Der Grund, warum Sie Probleme bei der Suche nach Vor- und Nachnamen haben könnten, ist, dass Sie Ihre Eingaben genau abgleichen müssen (natürlich unter Berücksichtigung des Falls). Was ich meine ist, wenn Sie George Washington als Eingabe verwenden, findet Ihr Programm keine Übereinstimmung für die George,Washington,(1789-1797) Zeile. Dies liegt daran, dass Ihr Programm George Washington als eine Zeichenfolge behandelt. Hinweis: Der Eingabe fehlt das Komma. Daher wird es nicht als Teilzeichenfolge von George,Washington,(1789-1797) betrachtet. Wenn Sie George,Washington als Eingabezeichenfolge verwendet haben, würde Ihr Programm die George Washington-Zeile drucken. Ihr Programm sucht nur, ob die Eingabezeichenfolge eine Teilzeichenfolge einer der Zeilen in Ihrer Datei ist. Es wird nicht speziell nach einem Vor- oder Nachnamen gesucht. Wenn Sie in als Eingabezeichenfolge verwenden, erhalten Sie eine Übereinstimmung für beide George Wash in gton und Frankl in D. Roosevelt.

Was Sie tun könnten, ist Ihre Eingabedaten zu nehmen und sie zu teilen und nach jedem der Begriffe zu suchen. Sie können entweder Zeilen akzeptieren, die allen angegebenen Bedingungen entsprechen, oder mindestens einen der angegebenen Begriffe.

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); 
} 

Dies berücksichtigt keine Namensreihenfolge. Wenn es das ist, was Sie anstreben, dann würde ich vorschlagen, eine Klasse zu erstellen und jede Zeile in der Datei als neues Objekt zu analysieren und zu versuchen, den ersten Begriff mit dem Vornamen und den zweiten mit dem Nachnamen zu versehen zu diesem Zweck.

+0

Ich schätze all das. Allerdings zeigt dies nichts an, egal was ich eintippe ... – rockymontana

+0

Könnten Sie bitte Beispiele dafür geben, was funktioniert und was nicht? Ich schätze, ich verstehe dein Problem nicht ganz. – drg