2015-11-14 19 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を1つの文字列として扱うためです。注:入力にカンマがないため、部分文字列はGeorge,Washington,(1789-1797)とはみなされません。入力文字列としてGeorge,Washingtonを使用した場合、プログラムはGeorge Washington行を出力します。あなたのプログラムは、入力文字列があなたのファイル中の行の部分文字列であるかどうかを調べるだけです。名前や姓を特に検索しません。 inを入力文字列として使用した場合、George Wash gton)とフランクル)の一致が得られます。ルーズベルト。

あなたができることは、入力データを分割し、それぞれの用語を検索することです。提供されたすべての条件に一致する行、または提供された条件の少なくとも1つに一致する行を受け入れることができます。

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