2015-11-14 6 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

Умм ... что? Да, я хочу спросить LOL ... – 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, но ya, я могу помочь u out с псевдокодом – Rubal

+0

Не разбираюсь в java самостоятельно, и не могу действительно следовать этому с точки зрения кода, но спасибо за помощь! – rockymontana

0

Причина, по которой у вас могут возникнуть проблемы с поиском по именам и фамилиям, является то, что вы должны точно соответствовать вашему вводу (игнорируя случай, конечно). Я имею в виду, если вы используете George Washington в качестве входных данных, ваша программа не найдет соответствия для линии George,Washington,(1789-1797). Это связано с тем, что ваша программа обрабатывает George Washington как одну строку. Примечание: на входе отсутствует запятая, поэтому она не будет считаться подстрокой George,Washington,(1789-1797). Если вы использовали George,Washington в качестве входной строки, ваша программа напечатала бы линию Джорджа Вашингтона. Ваша программа просто ищет, если строка ввода является подстрокой любой из строк в вашем файле. Он не ищет конкретно имя или фамилию. Если вы использовали in в качестве вашей строки ввода, то вы получите соответствие как для Джорджа Уоша в 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

Смежные вопросы