2015-11-14 80 views
6

所以我有一個文件,其中有所有的總統 - 他們的名字,中間首字母(如果有的話)和姓氏。字符串數組名搜索

該文件需要被讀入,並且用戶可以輸入一個總統的名字來搜索它,並且該總統應該被顯示。

如果用戶使用名字或姓氏進行搜索,但不能同時使用這兩種方法,則會顯示總統。

例如,外部文件包含:

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

我需要的用戶能夠以兩種類型中的第一個名字,姓氏,或兩者姓和名,並獲得所需的結果(大部分日期並不相關)。

嘗試了很多不同的東西,但沒有達到那裏,只要顯示總統,如果用戶搜索的名字和姓氏。

這是我走到這一步:

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

你想問一下? – sunysen

+0

呃...什麼?是的,我想問大聲笑... – rockymontana

回答

2

還有另一種方式,我可能已經實現this.Read文件輸入並存儲它們作爲對象(類LNAME,FNAME和年也許) 。通過這種方式,您可以從用戶輸入中搜索lname,並將其與相應的fname(作爲相同的對象)進行匹配。創建可以完成一次,搜索可以在一個while循環中完成,執行用戶同意繼續搜索。

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

實際上,有很多方法可以實現你想要編程的東西。你可以使用數組列表索引來解決它。如果以特定格式接收用戶的輸入,則可以將其映射到該列表中的索引。此外,如果您想要同時使用名字和姓氏,您可以使用這些代表姓名的索引來自同一個列表。

+0

我不知道我跟着不幸。認爲你可以張貼一些啓動代碼嗎? – rockymontana

+0

我不是一個不熟練的java,但雅,我可以幫你用僞代碼 – Rubal

+0

不熟練java自己,並不能真正遵循這個代碼,但非常感謝幫助! – rockymontana

0

您可能會遇到問題的名字和姓氏搜索的原因是因爲你必須準確地匹配你的輸入(當然忽略大小寫)。我的意思是,如果你使用George Washington作爲輸入,你的程序將不會找到匹配的George,Washington,(1789-1797)行。這是因爲您的程序將George Washington視爲一個字符串。注意:輸入缺少逗號,所以它不會被認爲是George,Washington,(1789-1797)的子字符串。如果您使用George,Washington作爲輸入字符串,那麼您的程序將打印喬治華盛頓系列。你的程序只是搜索輸入字符串是否是文件中任何行的子字符串。它不會專門搜索名字或姓氏。如果您使用in作爲您的輸入字符串,那麼您將得到George Wash , gton和Frankl D. Roosevelt的匹配。

你可以做的是把你的輸入數據和分裂它,並搜索每個條款。您可以接受符合所有提供條款的條款,或者至少包含一個條款。

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

這不考慮名稱排序。如果這就是你要做的,那麼我會建議創建一個類,並將文件中的每一行解析爲一個新對象,並嘗試匹配第一個名詞和第二個詞語,這些名字與姓氏一起提供,或者爲此。

+0

我欣賞這一切。但是,無論我輸入什麼內容,這都不會顯示... – rockymontana

+0

您能否提供什麼是和不在工作的示例?我想我不太瞭解你的問題。 – drg